Java | 演算子の優先順位と結合規則

Java Java
スポンサーリンク

「ビット演算子」「シフト演算子」は、0と1の並び(ビット列)がどのように動くか目で見て理解するのがいちばん早いです。

ここでは、Javaの整数を例に、「視覚的にどう動くか」を図で示します。


基本:ビット列のイメージ

数値はコンピュータの中で 2進数(ビット列) で表されます。

例:

10進数  5 →  0101
10進数  3 →  0011

4ビット(見やすくするために短くしています)で表すとこうです:

位置8421
50101
30011

ビット演算の「見える動き」

① 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.

タイトルとURLをコピーしました