Skip to the content.

最終更新日:2026年8月12日

まず結論

シフト演算とは、ビット列を左または右にずらす操作です。

基本情報技術者試験では、まず次の関係を押さえます。

左シフト
→ 2倍方向

右シフト
→ 2で割る方向

さらに、右シフトでは 論理シフトか算術シフトか を確認します。

論理右シフト
→ 左側を0で埋める

算術右シフト
→ 符号を保つように左側を埋める

特に16進数の値をシフトする問題では、無理に16進数のまま動かさず、

16進数
→ 2進数に直す
→ シフトする
→ 4ビットずつ16進数へ戻す

とすると安全です。

直感的な説明

シフト演算は、ビット列を横にずらす操作です。

例えば、次の2進数を考えます。

0000 0110

これは10進数で 6 です。

1ビット左にずらすと、

0000 1100

となり、10進数では 12 です。

つまり、1ビット左シフトは2倍のイメージです。

反対に、

0000 1100
↓ 右に1ビット
0000 0110

とすると、126 になります。

論理右シフトは「左から0を入れる」

例えば、16ビットの値が次のビット列だったとします。

1010 1011 1100 1101

これを2ビット右へ論理シフトすると、右端の2ビットは外へ押し出され、左側には 0 が入ります。

1010 1011 1100 1101
↓ 2ビット論理右シフト
0010 1010 1111 0011

4ビットずつ区切って16進数へ戻すと、

0010 → 2
1010 → A
1111 → F
0011 → 3

→ 2AF3

となります。

ここで大切なのは、論理シフトでは元の最上位ビットが1でも、空いた左側は0で埋めることです。

右シフトは「次に見るビットを右端へ持ってくる」操作でもある

ビット取り出し問題では、右シフトは値を半分にするためだけに使うわけではありません。

例えば、16進数 F0C3 を下位から1桁ずつ見るとします。

F | 0 | C | 3
            ↑
         今見る桁

次に C を見たいなら、値全体を右へ4ビット動かします。

F | 0 | C | 3
      ↓ 右へ4ビット
0 | F | 0 | C
            ↑
       次に見る桁

つまり、

今の4ビットを処理
↓
右に4ビットシフト
↓
次の4ビットが右端へ来る

という流れです。

下位4ビットの取り出しには、ビットマスクとは? のAND演算を組み合わせます。

値 AND 000F₁₆
→ 今の下位4ビットを取り出す

値を右に4ビット論理シフト
→ 次の4ビットを下位へ持ってくる

定義・仕組み

シフト演算では、ビット列を指定した方向へ移動します。

操作 意味 数値のイメージ
左シフト ビット列を左へずらす 2倍、4倍、8倍
右シフト ビット列を右へずらす 1/2、1/4、1/8

左シフト

1ビット左にずらすと2倍、2ビットなら4倍です。

0000 0011 = 3
0000 0110 = 6   ← 左に1ビット
0000 1100 = 12  ← 左に2ビット

ただし、固定ビット長では左端からあふれたビットは失われるので、常に数学的な意味で正確に2倍になるとは限りません。

右シフト

1ビット右にずらすと、2で割るイメージになります。

0000 1100 = 12
0000 0110 = 6   ← 右に1ビット
0000 0011 = 3   ← 右に2ビット

右端から押し出されたビットは失われます。

例えば 7 は、

0000 0111 = 7
↓ 右に1ビット
0000 0011 = 3

となります。

論理シフトと算術シフト

ここは科目Aでよく混同します。

種類 空いたビットの扱い 主な考え方
論理シフト 0を入れる 符号なしのビット列
算術右シフト 符号ビットを保つ 符号付き整数

例えば8ビットで先頭が 1 の値を右へ1ビット動かすとします。

論理右シフト
1001 0000
↓
0100 1000

算術右シフト
1001 0000
↓
1100 1000

論理右シフトでは左に 0 が入り、算術右シフトでは負数の符号を保つため左に 1 が入ります。

論理 = 0で埋める、算術右 = 符号を保つ

と切り分けます。

16進数1桁は4ビット

16進数1桁は、2進数4ビットに対応します。

0₁₆ = 0000₂
A₁₆ = 1010₂
F₁₆ = 1111₂

そのため、

16進数1桁分ずらす
→ 4ビットシフト

16進数2桁分ずらす
→ 8ビットシフト

と考えられます。

一方、2ビットシフトのように16進数の桁境界と合わない場合は、2進数へ直して処理する方が安全です。

シフトと加算で掛け算を行う

2進数の乗算では、乗数のビットを下位から順に調べる方法があります。

乗数の最下位ビットを見る
↓
1なら現在の被乗数を結果へ加える
↓
被乗数を左シフト
乗数を右シフト

例えば 3 × 3 なら、

X = 3 = 0011   ← 被乗数
Y = 3 = 0011   ← 乗数
Z = 0          ← 結果

1回目はYの最下位ビットが 1 なので、

Z = Z + X = 3
Xを左シフト → 6
Yを右シフト → 1

2回目も最下位ビットが 1 なので、

Z = Z + X = 9
Xを左シフト → 12
Yを右シフト → 0

となり、結果は 9 です。

公式の出題範囲やシラバスは、IPA:基本情報技術者試験 から確認できます。

科目Aでどう出る?

科目Aでは、シフト後のビット列や16進数を求める問題が出ます。

まず、次の順番で判断します。

1. 左か右か
2. 何ビット動かすか
3. 論理か算術か
4. 空いたビットを何で埋めるか
5. 必要なら16進数へ戻す

特に「論理右シフト」なら、

右へずらす
+
左側を0で埋める

の2点をセットで確認します。

16進数のシフト問題は2進数に直す

例えば ABCD₁₆ を2ビット右へ論理シフトするとします。

A    B    C    D
1010 1011 1100 1101

右に2ビットずらし、左を0で埋めます。

0010 1010 1111 0011

これを4ビットずつ16進数へ戻します。

0010 1010 1111 0011
  2    A    F    3

したがって結果は 2AF3₁₆ です。

試験中は、

16進 → 2進 → シフト → 16進

と処理すると、桁またぎのミスを減らせます。

倍率を問う問題

問題文の表現 判断
左に1ビット 2倍方向
左に2ビット 4倍方向
左に3ビット 8倍方向
右に1ビット 2で割る方向
右に2ビット 4で割る方向
右に3ビット 8で割る方向
16進数1桁分を移動 4ビット

ビット取り出し問題

1. 今の下位ビットを取り出す
   → ANDでマスク

2. 次に見るビットを下位へ持ってくる
   → 右シフト

乗算アルゴリズムでは、

乗数の最下位ビットを見る
被乗数は左シフト
乗数は右シフト

と整理します。

科目Bでどう使う?

科目Bでは、<<>> のような演算子が使われることがあります。

x << 1
→ xを左に1ビットシフト

x >> 1
→ xを右に1ビットシフト

例えば x = 6 なら、

6 = 0000 0110

x << 1
→ 0000 1100 = 12

x >> 1
→ 0000 0011 = 3

となります。

ただし、実際のプログラミング言語では符号付き整数の右シフトの仕様が関係することがあります。試験問題では、問題文に「論理シフト」「算術シフト」「符号なし」などの指定があるかを先に確認します。

複数ビットをまとまりとして処理するときは、

下位4ビットを使う
↓
右に4ビットシフト
↓
次の4ビットを下位へ持ってくる

と読みます。

スタックへ取り出した値を順番に格納する処理では、スタック vs キュー の追加・取出し順序と合わせて読むと処理を追いやすくなります。

よくある誤解・混同

❌ 右シフトなら必ず左を0で埋める

必ずではありません。

論理右シフト
→ 0で埋める

算術右シフト
→ 符号を保つ

と区別します。

❌ 16進数を2ビット動かすなら、16進数の桁をそのままずらせばよい

16進数1桁は4ビットです。

2ビットシフトは16進数の桁境界をまたぐので、2進数へ直す方が安全です。

16進数1桁
= 4ビット

❌ 2ビット左シフトは2倍

2ビット左シフトは、倍率のイメージでは 2² = 4倍 です。

❌ 右シフトで押し出されたビットも残る

固定ビット長では、右端から押し出されたビットは失われます。

❌ 右に4ビットシフトするのは、今の下位4ビットを保存するため

逆です。

今の下位4ビットを使い終えたあと、次の4ビットを右端へ持ってくるためにシフトします。

❌ 論理シフトと算術シフトは、どちらも同じ結果になる

先頭ビットが 1 の値を右シフトすると違いが出ます。

論理右
→ 0を入れる

算術右
→ 符号ビットを維持

まとめ(試験直前用)

  • 左シフトは2倍方向、右シフトは半分方向
  • 論理右シフトは左を0で埋める
  • 算術右シフトは符号を保つ
  • 16進数1桁は4ビット
  • 16進数の2ビットシフトなど、桁境界と合わない問題は 16進 → 2進 → シフト → 16進 で処理する
  • 右へ押し出されたビットは失われる
  • ビット取り出しでは、ANDで取り出してから右シフトで次のビットを下位へ持ってくる
  • 乗算では「乗数の最下位ビット・被乗数は左・乗数は右」を見る

試験中は、まず次の4点を確認します。

方向は?
何ビット?
論理か算術か?
空いた場所を何で埋める?

© 2024-2026 stemtazoo. All rights reserved.