1. ビット&演算子

すべてのデータはバイナリ表現でメモリに保存されると前述しました。そのため、かなり昔、プログラマーは 2 進数を扱うための興味深い方法をたくさん考え出しました。たとえば、Java には、数値のバイナリ表現のビットを操作する論理演算子&(AND)、| (OR)~(NOT または補数)、および^(XOR - 排他的論理和) があります。

a & b
ビット単位&(AND) 演算子

この演算子は論理&(AND) 演算子によく似ていますが、2 つではなく 1 つのアンパサンドで表される点が異なります。

そしてそれは個々のビットに適用されます。各オペランドはビットの配列として扱われ、i結果の 番目のビットはi2 つのオペランドのそれぞれの 番目のビットを使用して計算されます。

a 結果の最初のビットは、数値の最初のビットと数値の最初のビットに基づいて計算され、2 番目のビットはb数値の 2 番目のビットa と数値の 2 番目のビットに基づいて計算されますb

(AND)演算子&は、「数値の対応するビットが 1 に等しく、数値の対応するビットがa1 に等しい場合にのみAND、結果のビットbが 1 に等しい」ことを意味します。

1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0

例:

結果
0b0011 & 0b1010
0b0010
0b1111 & 0b0000
0b0000
0b1010 & 0b0101
0b0000
0b1111 & 0b1010
0b1010

2. ビット|演算子

この演算子は論理|(OR) 演算子とよく似ていますが、2 本の垂直線ではなく 1 本の垂直線で示される点が異なります。

a | b

そしてそれは個々のビットに適用されます。各オペランドはビットの配列として扱われ、結果の i 番目のビットは 2 つのオペランドのそれぞれの i 番目のビットを使用して計算されます。

ビット単位|(OR) 演算子は、「数値の対応するビットが 1 に等しい場合、数値の対応するビットaが 1 に等しい場合、結果のビットは 1 に等しい」ことを意味します。ORb

1 | 1 = 1
1 | 0 = 1
0 | 1 = 1
0 | 0 = 0

例:

結果
0b0011 | 0b1010
0b1011
0b1110 | 0b0000
0b1110
0b1010 | 0b0101
0b1111
0b1111 | 0b1010
0b1111

両方の数値の対応するビット (同じ位置にあるビット) が 0 の場合にのみ、結果の対応するビットが 0 に等しくなります。



3. ビット単位^(XOR または「排他的論理和」) 演算子

演算子はXOR排他的論理和とも発音され、 という記号で示されます^。キーボードで入力するには、shift + 6を押します(英語キーボード レイアウトの場合)。

a ^ b

この演算子は、OR名前が似ているという点も含めて、次の演算子に似ています。XOR

ビット単位^(XOR) 演算子は、「数値の対応するビットが 1 に等しい場合、結果のビットはa1 に等しくOR、数値の対応するビットがb1 に等しい場合は、両方が同時に等しいわけではない」ことを意味します。

1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0

例:

結果
0b0011 ^ 0b1010
0b1001
0b1110 ^ 0b0000
0b1110
0b1010 ^ 0b0101
0b1111
0b1111 ^ 0b1010
0b0101

両方の数値の対応するビット (同じ位置にあるビット) が異なる場合にのみ、結果の対応するビットが1 に等しくなります。ビットが同じ場合結果のビットはゼロになります。



4. ビット単位~(NOT、COMPLEMENT) 演算子

それが何をするかはすでに推測できると思います。この演算子は論理 (NOT) 演算子とよく似ていますが、感嘆符ではなくチルダ!で示されます。

~a

これは単項演算子であり、2 つの数値ではなく 1 つの数値に適用されることを意味します。この単一のオペランドの前に表示されます。

ビット~演算子は、「数値の対応するビットが 0 の場合、結果のビットはa1 であり、数値の対応するビットが 1 の場合、結果のビットは 0 であるa」ことを意味します。

~1 = 0
~0 = 1

例:

結果
~0b0011
0b1100
~0b0000
0b1111
~0b0101
0b1010
~0b1111
0b0000

1この演算子は、になるビット0と になるビットを0単純に変更します1