「ビット演算子」「シフト演算子」は、0と1の並び(ビット列)がどのように動くかを目で見て理解するのがいちばん早いです。
ここでは、Javaの整数を例に、「視覚的にどう動くか」を図で示します。
基本:ビット列のイメージ
数値はコンピュータの中で 2進数(ビット列) で表されます。
例:
10進数 5 → 0101
10進数 3 → 0011
4ビット(見やすくするために短くしています)で表すとこうです:
| 位置 | 8 | 4 | 2 | 1 |
|---|---|---|---|---|
| 5 | 0 | 1 | 0 | 1 |
| 3 | 0 | 0 | 1 | 1 |
ビット演算の「見える動き」
① AND演算(&)
両方が1の場所だけ1。
0101 (5)
&0011 (3)
------
0001 = 1
🟢「共通して1のところ」だけ残るイメージ。
② OR演算(|)
どちらかが1なら1。
0101 (5)
|0011 (3)
------
0111 = 7
🟢「1があるところをぜんぶ1にする」イメージ。
③ XOR演算(^)
片方だけ1なら1(両方同じなら0)。
0101 (5)
^0011 (3)
------
0110 = 6
🟢「違うところだけ1」。スイッチのON/OFF切り替えに便利!
④ NOT演算(~)
ビットを全部ひっくり返す(0→1、1→0)。
~0101
------
1010
🟢 つまり、「ONとOFFを反転する」。
Javaでは符号付き整数なので、~5 は -6 になります。
(理由:Javaの int は32ビット、符号付きだから)
シフト演算の「動く様子」
① 左シフト <<
0000 0101 (5)
<<1
↓
0000 1010 (10)
🟢 右に0が入って、左へずれる。
つまり、2倍になるイメージです。
0000 0101 << 2 → 0001 0100 (20)
→ 左に1動く=×2、2動く=×4 のように倍々。
② 右シフト >>(符号あり)
0000 0101 (5)
>>1
↓
0000 0010 (2)
🟢 右にずれると、1ビット分値が半分になる。
左端(空いたところ)は「符号ビット」で埋められます。
正の数なら0が入る。
1000 0000 (-128)
>>1 → 1100 0000 (-64)
負の数は左が1のまま(符号保持)。
③ 符号なし右シフト >>>
1000 0000 (-128)
>>>1
↓
0100 0000 (64)
🟢 左端は「常に0で埋める」。
符号を無視して単純に右にずらす。
→ 負の数が 大きな正の値 になることもある。
視覚イメージまとめ
| 演算子 | 動きのイメージ | 結果の傾向 |
|---|---|---|
& | 両方1だけ残る | マスク処理 |
| ` | ` | どちらか1なら1 |
^ | 違うところだけ1 | 切り替え |
~ | 0↔1 反転 | 補数計算 |
<< | 左にずらす(右に0) | ×2倍 |
>> | 右にずらす(符号あり) | ÷2(符号維持) |
>>> | 右にずらす(符号なし) | ÷2(符号無視) |
覚え方のコツ
<<は「左にズラす」→「大きくなる」→「×2」>>は「右にズラす」→「小さくなる」→「÷2」&は「共通部分」→ANDのA|は「どちらか」→ORのO^は「ちがうとき」→XOR(eXclusive OR)
実際にアニメーションで
See the Pen Java Bitwise Operation Visualizer by MONO365 -Color your days- (@monoqlo365) on CodePen.
使い方:
- 「数値」を入れて「ビット表示」を押すと、指定したビット幅(8/16/32)でビット列が表示されます。
- 各操作ボタン(AND/OR/XOR/NOT/<< / >> / >>> / Toggle)を押すと、ビットがアニメーションで変化して結果が表示されます。
- シフト量やアニメ速度は調整可能です。
- 「Toggle random bit」はランダムなビットを反転して動きを見るのに便利です。
See the Pen Java Bitwise Operation Visualizer #2 by MONO365 -Color your days- (@monoqlo365) on CodePen.
