web-dev-qa-db-ja.com

Javaでビット単位&(および)はどのように機能しますか?

私はいくつかのコード例を読んでいて、& 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

40
Anzwur

整数は、メモリ内のビットシーケンスとして表されます。人間との相互作用のために、コンピューターは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が残ります。

62
Markus Jarderot

これは二項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
...
9
Alex W

2進数で表される2つの数値を見ると、ビット単位の&は、両方の数字が1である各場所に1を持つ3番目の数字を作成します(他のすべての場所にゼロがあります)。



0b10011011 &
0b10100010 =
0b10000010


両方の引数がその場所に1つの引数を持っている場合のみ、その場所に表示されることに注意してください。
ビット単位のANDは、数値の各ビットに特定の情報が格納されている場合に役立ちます。
マスクを使用して、番号の特定のセクションを削除/抽出するために使用することもできます。

4
user2134086

16進コードに従って2つの変数を展開すると、次のようになります。

bitmask : 0000 0000 0000 1111
val:      0010 0010 0010 0010

これで、単純なビット単位のAND演算の結果、数値0000 0000 0000 0010、これは10進単位で2です。ただし、基本的なブール演算と数値システムについては知っていると思います。

3
dotslash

入力値に対する論理演算。値をバイナリ形式に変換し、位置nのボットビットが1である場合、結果は1になります。最後に変換して戻ります。

これらのサンプル値の例:

0x2222 =  10001000100010
0x000F =  00000000001111
result =  00000000000010   => 0x0002 or just 2
1
clearwater

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);
}
0
supritshah1289