FE EXAM

論理左シフト(ビット列を左にずらして右に0を入れる)

ビット列を左に N ビットずらす演算。右端には 0 が入り、左端のビットはあふれて捨てられるのがポイント。値としては2^N倍になります(あふれない範囲で)。

INTERACTIVE VISUALIZATION
右端に挿入された 0
あふれて捨てる
元の値
53
シフト回数
2
シフト後の値
212
あふれたビット
00
元の値 (10進)53
シフト回数2
プリセット
スライダーで元の値とシフト回数を変えてみてください。あふれない範囲なら値は 2^N 倍になります。「1 << 3 = 8」のように、左シフトは2倍を素早く計算するテクニックでもあります。
元のビット列
0
0
1
1
0
1
0
1
左に 2 ビット シフト
1
1
0
1
0
1
0
0
⚠️ あふれたビット(捨てられる)
左端から 2 ビット あふれました: 00
53 << 2 = 212(= 53 × 2^2 = 212)
解説

📌
論理左シフトとは

論理左シフトとは、ビット列を左に N 個ずらす演算です。プログラミング言語では << という演算子で書かれます(例: x << 2)。

動きの 2 つのルール:
右端には 0 が挿入される("論理"の名の通り、新しいビットは 0)
左端からあふれたビットは捨てられる

例: 8ビットの 53 (= 00110101) を左に 2 シフト
・元: 00110101 = 53
・左に2シフト: 11010100 = 212
・確認: 53 × 2² = 53 × 4 = 212 ✓

🔍
右端に 0 が入る理由

論理左シフトでは、ビットを 1 つずらすと右端が空席になります。この空席に何を入れるかが「論理シフト」を定義する重要なルールで、必ず 0 を入れるのが「論理」の意味です。

「論理」の語源:論理シフトはビットを純粋にずらすだけ。符号や数値としての意味を考えず、機械的に 0 を補充する。これがブール論理(純粋な 0/1 操作)に由来して「論理」と呼ばれる理由
なぜ 0 か:左にずらすと値は元の 2 倍 になるのが目的。右端は最も小さい桁(重み 1)なので、ここに 0 を入れれば「2 倍にして、端数なし」という関係が綺麗に成り立つ
もし 1 を入れたら?:その分だけ値が増えてしまい「× 2」ではなくなる。シフトの計算上の意味が失われる

例: 0011 0101 (53) を左に 1 シフトすると、右端に 0 が入って 0110 1010 (106) になる。確認: 53 × 2 = 106 ✓。10 進数の世界で 53 を「× 10」して 530 にするとき右端に 0 を書き足すのと同じイメージです。

⚖️
算術左シフトとの違い

シフト演算には論理シフト算術シフトの 2 種類がありますが、左シフトに関しては両者の動作は実質的に同じです。これは押さえておきたい重要ポイントです。

論理左シフト:右端に 0 を入れて、左端からあふれたビットは捨てる。符号は考えない
算術左シフト:同じく右端に 0 を入れて左端からあふれたビットを捨てる。動作は同じだが、「符号付き整数を 2 倍する」という意味を持たせている

違うのは「結果の解釈」「オーバーフローの扱い」です。算術シフトでは符号ビットが反転してしまうと「オーバーフロー」として検出されますが、論理シフトでは単に「あふれたビットを捨てた」だけと捉えます。

例: 8 ビット符号付きで 64 (0100 0000) を左に 1 シフト → 1000 0000
・論理シフトの解釈: 128(符号なしで読む)
・算術シフトの解釈: −128(符号付きで読む。本来 64 × 2 = 128 のはずが符号反転 → オーバーフロー)

左シフトはどちらも同じ動作、意味だけ違う」「右シフトは動作も違う」と整理しておくと混乱しません。

関連コンテンツ

論理左シフト | Vizigo