私はいくつかのコード例を読んでいて、&
OracleのWebサイトのBitwise and Bit Shift Operatorsページ。私の意見では、ビットごとの&
。私はそれがビットに直接操作を行うことを理解していますが、どのような操作かわからないだけで、その操作が何であるか疑問に思っています。 OracleのWebサイトから取得したサンプルプログラムを次に示します。 http://docs.Oracle.com/javase/tutorial/displayCode.html?code=http://docs.Oracle.com/javase/tutorial/ Java/nutsandbolts/examples/BitDemo.Java
整数は、メモリ内のビットシーケンスとして表されます。人間との相互作用のために、コンピューターは10進数として表示する必要がありますが、すべての計算は2進数として実行されます。 123
は10進数で1111011
としてメモリに保存されます。
&
演算子はビット単位の「And」です。結果は、両方の数値でオンになっているビットです。 1001 & 1100 = 1000
。最初のビットのみが両方でオンになるため。
|
演算子はビット単位の「Or」です。結果は、いずれかの数値でオンになっているビットです。 1001 | 1100 = 1101
。右から2番目のビットのみが両方ともゼロであるため。
^
および~
演算子もあり、それぞれビット単位の「Xor」およびビット単位の「Not」です。最後に、<<
、>>
、および>>>
シフト演算子があります。
内部では、123
はシステムに応じて01111011 00000000 00000000 00000000
または00000000 00000000 00000000 01111011
として保存されます。どちらの表現も論理番号00000000000000000000000001111011
として扱われるため、ビット演算子を使用しても、どちらの表現が使用されるかは重要ではありません。先行ゼロを取り除くと、1111011
が残ります。
これは二項AND演算子です。 ブール論理 の一部であるAND演算を実行します。これは、計算で2進数で一般的に使用されます。
例えば:
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
また、複数ビットの数値でこれを実行できます。
01 & 00 = 00
11 & 00 = 00
11 & 01 = 01
1111 & 0101 = 0101
11111111 & 01101101 = 01101101
...
2進数で表される2つの数値を見ると、ビット単位の&
は、両方の数字が1である各場所に1を持つ3番目の数字を作成します(他のすべての場所にゼロがあります)。
例:0b10011011 &
0b10100010 =
0b10000010
両方の引数がその場所に1つの引数を持っている場合のみ、その場所に表示されることに注意してください。
ビット単位のANDは、数値の各ビットに特定の情報が格納されている場合に役立ちます。
マスクを使用して、番号の特定のセクションを削除/抽出するために使用することもできます。
16進コードに従って2つの変数を展開すると、次のようになります。
bitmask : 0000 0000 0000 1111
val: 0010 0010 0010 0010
これで、単純なビット単位のAND演算の結果、数値0000 0000 0000 0010
、これは10進単位で2です。ただし、基本的なブール演算と数値システムについては知っていると思います。
入力値に対する論理演算。値をバイナリ形式に変換し、位置nのボットビットが1である場合、結果は1になります。最後に変換して戻ります。
これらのサンプル値の例:
0x2222 = 10001000100010
0x000F = 00000000001111
result = 00000000000010 => 0x0002 or just 2
Bitwise ANDの仕組みを知るだけでは十分ではありません。学習の重要な部分は、学習したことをどのように適用できるかです。次に、ビット単位のANDを適用するユースケースを示します。例:
1のバイナリにバイナリの偶数を追加すると、ゼロになります。すべての偶数には最後のビット(左から右に読む)があり、最後のビットは1だけであるため1です。
数値として引数を取り、加算、乗算、除算、減算、モジュロを使用せずに偶数に対してtrueを返す関数を作成するように依頼した場合、数値を文字列に変換できません。
この関数は、ビット単位のANDを使用するための完璧な使用例です。前に説明したように。コードを見せてもらえますか? Javaコード。
/**
* <p> Helper function </p>
* @param number
* @return 0 for even otherwise 1
*/
private int isEven(int number){
return (number & 1);
}