対象試験と出題頻度
シフト演算(論理シフト・算術シフト)は、基本情報技術者・応用情報技術者で出題されるテーマです。
「ビット列をシフトした結果を求めよ」という計算問題と、「シフトの組み合わせでN倍を実現する操作を選べ」という応用問題の2パターンが繰り返し出題されています。
FE H24秋期 午前問1、FE H25秋期 午前問2、FE H29秋期 午前問1など、試験区分をまたいで定番化している頻出論点です。
詳細をクリックして確認
基本情報技術者
応用情報技術者
★★★★☆
ランクA(重要)必ず覚えておくべき
用語の定義
情報処理試験を勉強していると、「論理シフトと算術シフト、結局何が違うの?」と混乱しがちです。
シフト演算(Shift Operation)とは、一言で言うと
「2進数のビット列を左または右にずらすことで、乗算や除算を高速に行う演算手法」
のことです。
イメージとしては、「そろばんの玉を一斉に左右へずらす操作」です。
そろばんで桁を1つ左にずらせば値は10倍、右にずらせば1/10倍になります。
2進数の世界では、左に1ビットずらすと2倍、右に1ビットずらすと1/2倍。掛け算・割り算をビットの移動だけで実現するのがシフト演算の本質です。
📊 シフト演算の基本情報
| 項目 | 内容 |
|---|---|
| 英語名 | Shift Operation |
| 種類 | 論理シフト(Logical Shift)・算術シフト(Arithmetic Shift) |
| 核心ルール | 左に n ビット → 2n 倍 / 右に n ビット → 1/2n 倍 |
| 使いどころ | 符号なし整数の乗除算(論理シフト)、符号付き整数の乗除算(算術シフト) |
解説
コンピュータのCPUにとって、乗算や除算は加算・減算と比べてはるかにコストが高い処理です。しかし「2の累乗倍」に限れば、ビット列を左右にスライドさせるだけで実現できます。
この操作がシフト演算であり、CPUの命令セットにも組み込まれている基本操作です。
シフト演算には「論理シフト」と「算術シフト」の2種類があり、「はみ出した側の反対にどんな値を埋めるか」がすべての違いです。
論理シフトの仕組み
論理シフトは、符号の概念を持たない「符号なし整数」向けのシフトです。
ビット列全体を左右にずらし、空いたビットには常に0を埋めます。
論理シフトの計算例(8ビット)
元の値:0 1 0 1 1 0 0 0(10進数 88)
左に2ビット論理シフト ↓
結 果:0 1 1 0 0 0 0 0(10進数 352 → 8ビットでは桁あふれ)
※ 赤字=はみ出して消える / 緑字=0で埋まる
右論理シフトの計算例(16ビット・16進数)
元の値:ABCD(16進数)= 1010 1011 1100 1101
右に2ビット論理シフト ↓
結 果:0010 1010 1111 0011= 2AF3(16進数)
※ FE H25秋期 午前問2で出題された計算です
算術シフトの仕組み
算術シフトは、「符号付き整数」(2の補数表現)向けのシフトです。
最上位の符号ビットを固定したまま、残りのビットを左右にずらします。
ここだけは確実に押さえてください。右シフト時に空いたビットを埋める値が論理シフトとの最大の違いです。
📊 論理シフトと算術シフトの違い
| 比較項目 | 論理シフト | 算術シフト |
|---|---|---|
| 対象 | 符号なし整数 | 符号付き整数(2の補数表現) |
| 符号ビット | 特別扱いしない(他のビットと同様にずらす) | 固定(シフト対象に含めない) |
| 左シフト時 空きビット |
0で埋める | 0で埋める |
| 右シフト時 空きビット |
0で埋める | 符号ビットと同じ値で埋める |
算術右シフトの計算例(8ビット・負数)
元の値:1 1 0 1 0 0 0 0(10進数 −48 ※2の補数表現)
右に2ビット算術シフト ↓
結 果:1 1 1 1 1 0 1 0 0(10進数 −12)
※ 符号ビット 1 は固定。空いた2ビットも 1 で埋まる → −48 ÷ 4 = −12
※ FE H24秋期 午前問1で出題された計算です
シフトと加算の組み合わせで任意の倍率を実現する
シフト演算だけでは2の累乗倍しか作れません。しかし、シフト結果同士を加算すれば任意の整数倍を組み立てられます。
▶ xを10倍する手順を図解する(クリックで展開)
10 = 8 + 2 = 23 + 21 なので、「3ビット左シフト+1ビット左シフト」の合算でも作れます。ただし、FE H29秋期 午前問1では別の分解が正解でした。
【FE H29秋の正解手順】10 = (4+1) × 2 = 5 × 2
① x を2ビット左シフト → 4x
② ①に x を加算 → 4x + x = 5x
③ ②を1ビット左シフト → 5x × 2 = 10x
このように、試験では「10をどう分解するか」ではなく「選択肢の操作を追って何倍になるか検算する」のが確実な解法です。
では、この用語が試験でどのように出題されるか見ていきましょう。
💡 シフト演算の核心を3行で
・左に n ビットずらすと 2n 倍、右に n ビットずらすと 1/2n 倍
・論理シフトは空きを常に0で埋める。算術シフトの右シフトだけは符号ビットで埋める
・シフト+加算の組み合わせで任意の整数倍を実現でき、試験では「何倍になるか」を検算する力が問われる
試験ではこう出る!
シフト演算は、FE・APの午前(科目A)序盤で繰り返し出題されている定番テーマです。出題パターンは大きく3つに分かれます。
📊 過去問での出題実績
| 試験回 | 出題内容 | 問われたポイント |
|---|---|---|
| FE H29秋 午前 問1 |
正の整数 x を10倍する操作を、シフトと加算の組み合わせから選ぶ問題。 | ・各選択肢を順に追って何倍になるか検算する ・10 = (4+1)×2 の分解が正解 |
| FE H25秋 午前 問2 |
32ビットレジスタの16進数ABCDを右に2ビット論理シフトした結果を求める問題。 | ・16進→2進の変換 + 論理右シフト + 2進→16進の逆変換 ・空きビットに0を埋めることを忘れないか |
| FE H24秋 午前 問1 |
8ビットの2進数11010000を右に2ビット算術シフトし、別の値から減じた結果を求める問題。 | ・算術右シフトで符号ビットをコピーする操作 ・2の補数表現での減算を正しく処理できるか |
| AP H22春 午前 問5 |
シフト演算と加算の繰返しで2進整数の乗算を行う流れ図の穴埋め問題。 | ・シフトと加算で乗算を実現するアルゴリズム ・流れ図の追跡力が問われる |
📝 IPA試験での出題パターン
パターン1:「シフト結果のビット列を求めよ」
16進数で与えられた値を2進数に変換し、指定ビット分シフトして戻す計算問題。論理シフトか算術シフトかを問題文で確認し、空きビットの埋め方を間違えないことが鉄則。
パターン2:「シフトと加算でN倍する操作を選べ」
FE H29秋 問1のように、シフトと加算を組み合わせた選択肢を追って何倍になるか検証する形式。「2ビット左シフト=4倍」「3ビット左シフト=8倍」を瞬時に判断できるかがスピード勝負。
パターン3:「算術シフト+2の補数の複合計算」
FE H24秋 問1のように、負数の算術シフト結果を使って加減算を行う問題。固定小数点数の2の補数表現の知識と合わせて出題されるため、両方の理解が必須。
試験ではここまででOKです。循環シフト(ローテート)や符号拡張の詳細まで問われることは稀なので、深追いは不要です。
【確認テスト】理解度チェック
ここまでの内容を理解できたか、簡単なクイズで確認してみましょう。
Q. 8ビットの2進数で表された負の整数を右に3ビット算術シフトした場合の説明として、最も適切なものはどれでしょうか?
- A. 符号ビットを含むすべてのビットを右にずらし、左側の空いた3ビットには0を埋める。
- B. 符号ビットを固定したまま残りのビットを右にずらし、左側の空いた3ビットには符号ビットと同じ1を埋める。
- C. 符号ビットを固定したまま残りのビットを右にずらし、左側の空いた3ビットには0を埋める。
正解と解説を見る
正解:B
解説:
算術右シフトでは、符号ビット(最上位ビット)を固定したまま残りのビットを右にずらし、左側に空いたビットには符号ビットと同じ値を埋めます。負の整数は符号ビットが1なので、空きビットも1で埋まります。これにより、シフト後も値の正負が保たれ、1/2n倍(この場合は1/8倍)の除算として正しく機能します。
選択肢Aは論理右シフトの説明です。符号ビットを特別扱いせず全ビットをずらして0で埋めるため、符号なし整数向けの操作です。選択肢Cは符号ビットの固定までは正しいですが、空きビットに0を埋めると負数の場合に符号情報が失われ、正しい除算結果になりません。
よくある質問(FAQ)
Q. プログラミング言語でシフト演算はどう書きますか?
C言語やJavaでは「<<」が左シフト、「>>」が右シフトの演算子です。例えば x << 2 は x を左に2ビットシフトして4倍にします。Javaでは「>>>」が論理右シフト、「>>」が算術右シフトと区別されています。Pythonでは「>>」は算術右シフトとして動作し、論理右シフトの専用演算子はありません。試験ではプログラミング言語の構文は問われませんが、実務で頻繁に使う知識です。
Q. 算術左シフトと論理左シフトの結果は同じですか?
操作としてはほぼ同じです。どちらも右側の空きビットに0を埋めます。ただし算術左シフトでは符号ビットを固定する仕様のCPUもあり、その場合シフトによって符号が変わるとオーバーフローとして検知されます。IPA試験では「算術シフトの右シフトで符号ビットが保持される」点が圧倒的に頻出であり、左シフトの差異を深掘りする出題はありません。
Q. 「循環シフト(ローテート)」とは何ですか?
はみ出したビットを反対側に回り込ませるシフト操作です。例えば8ビットの値を左に1ビット循環シフトすると、最上位からはみ出した1ビットが最下位に入ります。暗号処理やハッシュ関数の内部で使われますが、IPA試験の基本情報・応用情報の範囲ではほぼ出題されません。用語として知っていれば十分です。
Q. 算術右シフトで負の奇数を割ると端数はどうなりますか?
負の方向に切り捨て(負の無限大方向への丸め)になります。例えば −7 を右に1ビット算術シフトすると、−7 ÷ 2 = −3.5 ですが結果は −4 になります。通常の整数除算(0方向への丸め)で −7 ÷ 2 = −3 となるのとは異なる点に注意してください。IPA試験では端数処理まで踏み込んだ問題は出ていませんが、プログラミングではバグの原因になるため実務上は重要な知識です。