BIT SHIFT

ビットシフト演算のやり方

ビットシフトは、2進数の各ビットを左または右へ移動させる演算です。基本ルールを覚えれば、計算はかなりシンプルです。

左シフト(<<)

すべてのビットを左へ移動し、右側の空いた桁を0で埋めます。固定bit幅では、左端からはみ出したビットは捨てます。

8bit 00001101 << 1 ↓ 00011010
ポイント:桁あふれがなければ、1bit左シフトは値を2倍することと同じです。

右シフト(>>)

すべてのビットを右へ移動します。このトレーニングでは論理右シフトを扱い、左側の空いた桁は0で埋めます。

8bit 00110100 >> 2 ↓ 00001101
ポイント:符号なし整数では、1bit右シフトは小数部分を切り捨てながら2で割ることに相当します。

固定bit幅では「はみ出し」に注意

たとえば4bitの 1100 を左へ1bitシフトすると、本来は11000ですが、4bitでは左端の1が範囲外になります。

1100 << 1 11000 ↓ 4bitだけ残す 1000

算術右シフトとの違い

右シフトには「論理右シフト」と「算術右シフト」があります。論理右シフトは左側を0で埋めます。算術右シフトは符号付き整数で符号を維持するため、最上位ビットを引き継ぐ場合があります。

シフト演算を解く手順

まずbit幅を確認し、左または右へ指定数だけ移動します。論理シフトでは空いた桁を0で埋め、固定bit幅から外れたbitは捨てます。

具体例:8bitの左シフト

00101101 を1bit左へ論理シフト
01011010
元の値45に対して結果は90です。桁あふれがなければ、左1bitシフトは2倍に対応します。

右シフトの考え方

符号なし整数の論理右シフトでは、左側を0で埋めます。右へ1bit移動するごとに、整数としては概ね2で割る操作に対応します。

よくある間違い

bit幅を無視して桁を残さない
8bit問題なら結果も8bitです。また、論理シフトと符号を考慮する算術シフトを混同しないよう、問題文の指定を確認しましょう。

試験でのポイント

シフト後の2進数を書いてから10進数へ戻すと、暗算だけで処理するより桁あふれや0埋めのミスを減らせます。

ビットシフトとは?

ビットシフトは、2進数の各bitを左または右へ移動する操作です。左シフト・右シフトがあり、整数の計算やbit単位の処理を理解するうえで重要です。

左シフトすると何倍になる?

桁あふれがない符号なし整数では、1bit左へ移動すると2倍、2bitなら4倍、3bitなら8倍に対応します。

00101101₂(45)を1bit左へ論理シフト → 01011010₂(90)

右シフトするとどうなる?

符号なし整数の論理右シフトでは、1bit右へ移動するごとに整数として概ね2で割る操作に対応します。右端から外れたbitは捨てられます。

論理シフトと算術シフトの違い

論理シフトは空いたbitを0で埋めます。算術右シフトでは、符号付き整数の符号を保つため最上位bitを考慮して埋める場合があります。問題文でどちらのシフトか確認することが重要です。

ビットシフトでよくある間違い

指定されたbit幅を無視しない
8bitならシフト後も8bitとして考え、範囲外へ出たbitを残さないようにします。
理解したら10問練習
左シフト・右シフトを4bit・8bit・16bitで反復できます。

図で理解する:左シフトと右シフト

8ビットの 00101101(45) を1ビット動かして比較します。

元の値:45
00101101
↓ 左へ1ビット(末尾に0)
論理左シフト:90
01011010
↑ 元の値から右へ1ビット(先頭に0)
論理右シフト:22
00010110

左シフトは桁あふれがなければ2倍、符号なし整数の右シフトは2で割った商の切り捨てに相当します。符号付きの算術右シフトとは区別しましょう。

実務ではどこで使う?

通信プロトコルのビットフィールドを取り出したり、複数のフラグを1つの整数に格納したりするときに役立ちます。

確認問題:8ビットの 10000001 を左へ1ビット論理シフトすると?

左端の1があふれて捨てられるため、結果は 00000010 です。

ビットシフト問題を解く →

実際に手を動かす:ビットシフトの検算

例題:8ビットの00001101を左に2ビットずらす

元の値:00001101(10進数で13)

左に2ビット:00110100(10進数で52)

検算:13 × 2² = 52

ただし、ビット幅が固定されている場合は左端からはみ出したビットが失われます。「左シフトは常に2倍」と覚えるのではなく、桁あふれがないかを確かめてください。

例題:負の数で論理シフトと算術シフトを比較

8ビットの2の補数表現で -8 は11111000です。右に1ビット論理シフトすると01111100(124)ですが、符号ビットを保つ算術右シフトでは11111100(-4)になります。両者は負の数で結果が異なります。

理解度チェック:00010110を右に1ビット論理シフトすると?

00001011(10進数で11)です。元の22を2で割った値と一致します。

ビットシフトの練習問題を解く → 2の補数の解説を読む →