Java - ビット演算子

ビット演算子

Java でのビット演算子は以下のとおりです。

ビット演算子
演算子説明結果
&論理積0x55 & 0x0F0x05
|論理和0x55 | 0x0F0x5F
^排他的論理和0x55 ^ 0x0F0x5A
~論理否定~ 0x550xFFFF FFFF FFFF FFAA
<<左ビットシフト10 << 240
>>右ビットシフト (符号あり)10 >> 22
>>>右ビットシフト (符号なし)10 >>> 22

ビット演算とは、数値を 2 進数で表し、各ビットに対して演算を行います。OS が 32 bit の場合は 32 桁、64 bitの場合は 64 桁で表されます。

// 2 進数で 5 を表す場合 (32bit)

0000 0000 0000 0000 0000 0000 0000 0101
---- ---- ---- ---- ---- ---- ---- ----
   0    0    0    0    0    0    0    5
2 進数で 5 を表す場合 (32bit)

論理積

論理積の演算は、左辺と右辺の同じ位置にあるビットを比較し、両方のビットが「1」である場合、「1」を返します。

0000 0000 0000 0000 0000 0000 0101 0101  // 0x0000 0055
0000 0000 0000 0000 0000 0000 0000 1111  // 0x0000 000F
---------------------------------------
0000 0000 0000 0000 0000 0000 0000 0101  // 0x0000 0005
論理積

論理和

論理和の演算は、左辺と右辺の同じ位置にあるビットを比較し、いずれかのビットが「1」である場合、「1」を返します。

0000 0000 0000 0000 0000 0000 0101 0101  // 0x0000 0055
0000 0000 0000 0000 0000 0000 0000 1111  // 0x0000 000F
---------------------------------------
0000 0000 0000 0000 0000 0000 0101 1111  // 0x0000 005F
論理和

排他的論理和

排他的論理和の演算は、左辺と右辺の同じ位置にあるビットを比較し、片方のビットが「1」で、もう片方のビットが「0」である場合、「1」を返します。

0000 0000 0000 0000 0000 0000 0101 0101  // 0x0000 0055
0000 0000 0000 0000 0000 0000 0000 1111  // 0x0000 000F
---------------------------------------
0000 0000 0000 0000 0000 0000 0101 1010  // 0x0000 005A
排他的論理和

論理否定

論理否定の演算は、ビットを反転します。

0000 0000 0000 0000 0000 0000 0000 1111  // 0x0000 000F
---------------------------------------
1111 1111 1111 1111 1111 1111 1111 0000  // 0xFFFF FFF0
論理否定

左ビットシフト

左ビットシフトは、指定した数だけ左へシフトします。左から桁落ちしたビットは捨てられ、シフトしたことで空いた右側には 0 が埋められます。

// 左に 2 桁シフト
0000 0000 0000 0000 0000 0000 0000 1111  // 0x0000 000F
---------------------------------------
0000 0000 0000 0000 0000 0000 0011 1100  // 0x0000 003C
左ビットシフト

右ビットシフト (符号あり)

右ビットシフト (符号あり) は、指定した数だけ右へシフトします。右から桁落ちしたビットは捨てられ、シフトしたことで空いた左側には元のビットが 1 だった場合は 1 が埋められ、元のビットが 0 だった場合は 0 が埋められます。

// 右に 2 桁シフト
0000 0000 0000 0000 0000 0000 0000 1111  // 0x0000 000F
---------------------------------------
0000 0000 0000 0000 0000 0000 0000 0011  // 0x0000 0003
右ビットシフト (符号あり)
// 右に 2 桁シフト
1111 1111 1111 1111 1111 1111 1111 0000  // 0xFFFF FFF0
---------------------------------------
1111 1111 1111 1111 1111 1111 1111 1100  // 0xFFFF FFFC
右ビットシフト (符号あり)

右ビットシフト (符号なし)

右ビットシフト (符号なし) は、指定した数だけ右へシフトします。右から桁落ちしたビットは捨てられ、シフトしたことで空いた左側には常に 0 が埋められます。

// 右に 2 桁シフト
0000 0000 0000 0000 0000 0000 0000 1111  // 0x0000 000F
---------------------------------------
0000 0000 0000 0000 0000 0000 0000 0011  // 0x0000 0003
右ビットシフト (符号あり)
// 右に 2 桁シフト
1111 1111 1111 1111 1111 1111 1111 0000  // 0xFFFF FFF0
---------------------------------------
0011 1111 1111 1111 1111 1111 1111 1100  // 0x3FFF FFFC
右ビットシフト (符号あり)

関連記事