---
title: "シフト演算とは？左シフト・右シフトと2倍・半分の関係【基本情報技術者試験】"
description: "シフト演算を「ビット列を左または右にずらす操作」として整理し、左シフトは2倍、右シフトは半分、論理シフトと算術シフトの違いをFE試験向けに解説します。"
last_modified_at: "2026-07-02"
canonical_url: "https://stemtazoo.github.io/fe/shift-operation/"
section: "fe"
---

## まず結論

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

基本情報技術者試験では、まず次の関係を押さえると判断しやすいです。

```text
左シフト → 2倍するイメージ
右シフト → 2で割るイメージ
```

ただし、これは符号なしの2進数や、あふれたビットを無視する前提での考え方です。

試験では、**左にずらすのか、右にずらすのか、空いたところに何を入れるのか** を見ます。

## 直感的な説明

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

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

```text
0000 0110
```

これは10進数で `6` です。

1ビット左にずらすと、次のようになります。

```text
0000 1100
```

これは10進数で `12` です。

つまり、1ビット左にずらすと、値は2倍になります。

反対に、次のビット列を1ビット右にずらすとします。

```text
0000 1100
↓ 右に1ビット
0000 0110
```

`12` が `6` になるので、右シフトは2で割るイメージです。

## 定義・仕組み

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

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

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

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

右シフトでは、1ビット右にずらすと2で割ったような値になります。

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

ただし、右にずらして割り切れない場合は、下位ビットが落ちます。

例えば、`7` は2進数で `0000 0111` です。

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

10進数でいうと、`7 ÷ 2 = 3 あまり 1` なので、あまりに相当するビットが落ちたと考えます。

このテーマは、基本情報技術者試験の「基礎理論」や「情報に関する理論」と関係する内容です。公式の出題範囲やシラバスは、[IPA：基本情報技術者試験](https://www.ipa.go.jp/shiken/kubun/fe.html) から確認できます。

## 科目Aでどう出る？

科目Aでは、ビット列を左または右にシフトした結果を選ぶ問題が出題されやすいです。

まずは、方向と倍率を対応させます。

| 問題文の表現 | 判断 |
|---|---|
| 左に1ビットシフト | 2倍 |
| 左に2ビットシフト | 4倍 |
| 左に3ビットシフト | 8倍 |
| 右に1ビットシフト | 2で割る |
| 右に2ビットシフト | 4で割る |
| 右に3ビットシフト | 8で割る |

例えば、`0000 1010` は10進数で `10` です。

左に1ビットシフトすると、次のようになります。

```text
0000 1010
↓ 左に1ビット
0001 0100
```

これは10進数で `20` です。

反対に、右に1ビットシフトすると、次のようになります。

```text
0000 1010
↓ 右に1ビット
0000 0101
```

これは10進数で `5` です。

## 科目Bでどう使う？

科目Bでは、プログラム中で `<<` や `>>` のような演算子が使われる場合があります。

一般に、次のように読みます。

```text
x << 1 → xを左に1ビットシフト
x >> 1 → xを右に1ビットシフト
```

例えば、`x = 6` のとき、`x << 1` は次のように考えます。

```text
6 = 0000 0110
左に1ビット
0000 1100 = 12
```

一方で、`x >> 1` は次のようになります。

```text
6 = 0000 0110
右に1ビット
0000 0011 = 3
```

科目Bでは、シフト演算を見たら、まず **2の累乗を掛ける・割る操作** として読むと、処理の意味を追いやすくなります。

## よくある誤解・混同

シフト演算でよくある誤解は、**左右の方向と倍率を逆に覚えてしまうこと** です。

| 誤解 | 正しい理解 |
|---|---|
| 左シフトは半分になる | 左シフトは2倍方向 |
| 右シフトは2倍になる | 右シフトは半分方向 |
| 2ビット左シフトは2倍 | 2ビット左シフトは4倍 |
| 右シフトで落ちたビットも残る | 右に押し出されたビットは落ちる |
| 符号付き整数でも必ず単純に半分 | 算術シフトでは符号ビットの扱いに注意 |

シフトには、論理シフトと算術シフトという考え方もあります。

| 種類 | 空いたビットの扱い | 主な用途 |
|---|---|---|
| 論理シフト | 空いたところに0を入れる | 符号なしのビット列 |
| 算術シフト | 符号を保つように扱う | 符号付き整数 |

FE試験の基本問題では、まず **左は2倍、右は半分** を押さえます。

そのうえで、符号付き整数や算術シフトが出てきたら、符号ビットの扱いに注意します。

## まとめ（試験直前用）

- シフト演算は、ビット列を左または右にずらす操作
- 左シフトは、2倍方向に値が変わる
- 右シフトは、2で割る方向に値が変わる
- 1ビットなら2倍または1/2、2ビットなら4倍または1/4
- 右シフトでは、押し出された下位ビットが落ちる
- 論理シフトは空いたところに0、算術シフトは符号ビットに注意
