FE EXAM

論理右シフト(左端に0、右端は捨てる)

ビット列を右に N ビットずらす演算。左端には必ず0が挿入され、右端からあふれたビットは捨てられます。符号なし整数では2^N で割るのと同じ。

INTERACTIVE VISUALIZATION
左端に挿入された 0
あふれて捨てる
元の値
200
シフト回数
2
シフト後の値
50
あふれビット
00
元の値 (10進・符号なし)200
シフト回数2
プリセット
元のビット列
1
1
0
0
1
0
0
0
右に 2 ビット シフト
0
0
1
1
0
0
1
0
⚠️ 右端からあふれたビット(捨てられる)
右端から 2 ビット あふれた: 00
200 >> 2 = 50(≒ 200 ÷ 2^2 = 50)
解説

📌
論理右シフトとは

論理右シフトは、ビット列を右に N ビットずらす演算で、左端には 0 が入るのが特徴です。プログラミングでは >>> (Java/JavaScript)、>> (符号なし) などで書かれます。

動きの2つのルール:
左端には 0 が挿入される(「論理」シフトの定義)
右端からあふれたビットは捨てられる

例: 16 (= 00010000) を右に 2 シフト
・元: 00010000 = 16
・右に2シフト: 00000100 = 4
・確認: 16 ÷ 2² = 16 ÷ 4 = 4 ✓

🔍
左端に 0 が入る理由

論理右シフトでは、ビットを 1 つ右にずらすと左端が空席になります。「論理シフト」では、ここに必ず 0 を入れるのがルール。これは「論理」という名前の由来でもあります。

「論理」とは:ビットを純粋にずらすだけで、符号や数値の意味を考えない動作。符号ビットを保護しないので、結果はあくまで「符号なし整数として」解釈する
なぜ 0 か:左端は最も大きい桁(重み 128 など)。ここに 0 を入れれば、結果が「÷2」という関係を保てる。1 を入れてしまうと値が大幅に増えてしまい、シフトの計算上の意味が失われる
符号付き整数で使うと危険:もし元が負の数(最上位ビット = 1)でも、論理シフトは構わず 0 を入れる。結果として負の数が突然正の数に変わる。これが論理と算術の最大の違い

例: 1100 0000 (符号なしで 192) を右に 1 シフト → 0110 0000 = 96。確認: 192 ÷ 2 = 96 ✓。シフトで右端から押し出されたビットは捨てられるので、奇数を割ると切り捨てになります(例: 5 >> 1 = 2、2.5 ではない)。

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

左シフトでは論理も算術も動作が同じでしたが、右シフトは両者で動作がはっきり違います。これは重要なポイントです。違いは「左端に何を入れるか」の1点に集約されます。

論理右シフト:左端には必ず 0 を入れる。符号は無視。符号なし整数向け
算術右シフト:左端には元の最上位ビット(符号ビット)を複製して入れる。符号付き整数向け

例: 1111 0000 (符号なしで 240、符号付きで −16)を右に 1 シフトすると...
論理シフト: 0111 1000 = 120(240 ÷ 2、符号なしとして正しい)
算術シフト: 1111 1000 = 248(符号なし) / −8(符号付き、−16 ÷ 2 として正しい)

使い分けの原則は「扱う値が符号付きか符号なしか」。負の数を ÷2 したいなら算術、純粋にビットを右にずらしたいだけなら論理を使います。プログラミング言語によっては >>(算術)と >>>(論理、Java)のように演算子が分かれています。

関連コンテンツ