基本情報技術者 2009年 春期 午前(科目A) 問01
問題文
数値を2進数で格納するレジスタがある。このレジスタに正の整数を設定した後、“レジスタの値をビット左にシフトして、を加える”操作を行うと、レジスタの値はの何倍になるか。ここで、あふれ(オーバフロー)は、発生しないものとする。
選択肢
ア:3
イ:4
ウ:5(正解)
エ:6
🔒 解説は解答すると表示されます
2ビット左シフトと加算【午前解説】
正解の理由
正解:ウ
理由は単純かつ基本的な二進数の性質に基づきます。ビット左シフトは全ビットを左へつ移動させる操作で、数値としては倍になります。操作の流れが「シフトしてからを加える」なので、最終値は となり、答えはの5倍です。例として を取ると、(二進数 11)を左に2ビットシフトして12(1100)にし、元の3を加えると15(1111)で5倍になります。
理由は単純かつ基本的な二進数の性質に基づきます。ビット左シフトは全ビットを左へつ移動させる操作で、数値としては倍になります。操作の流れが「シフトしてからを加える」なので、最終値は となり、答えはの5倍です。例として を取ると、(二進数 11)を左に2ビットシフトして12(1100)にし、元の3を加えると15(1111)で5倍になります。
解法ステップ
- 問題文を正確に読む:「レジスタの値をビット左にシフトして、を加える」順序を確認。
- 左シフトの意味を記述:ビット左シフトは値を倍にする。
- 加算を行う:シフト後の値に元のを加えるので合計は。
- 計算して簡約:で、結果はの5倍であると結論づける。
- 必要なら具体例で検算(例:など)して理解を確認。
選択肢別の誤答解説
- ア: 3 — 誤り。これは「左シフト1ビットしてからを加える」や「単純ににを加えた」等の誤認と一致しますが、問題はビットシフトです。
- イ: 4 — 誤り。ビット左シフトだけならですが、問題はそれに元のを加える操作が続くため最終はになります。
- ウ: ウ — 正解。ビット左シフトでになり、そこへを加えてとなるため。
- エ: 6 — 誤り。となるには例えばや別の操作が必要で、本設問の手順では生じません。
よくある誤解
- シフト量をビットの乗算(2倍)と混同して、ビットシフトを倍と誤認する点。正しくは倍です。
- 「加算を先に行う」と誤解して、をシフトするなど操作順序を取り違える点。問題文は「シフトしてを加える」です。
- 符号付き整数やオーバーフローの扱いを無視して安全に乗算と考えるが、実務では符号やオーバーフロー規則に注意が必要です。
補足コラム
- 一般則:ビット左シフトは数学的に倍に相当します(符号や言語仕様で例外あり)。
- ハードウェア/言語差異:C言語では符号付き左シフトでオーバーフローが起きると未定義動作となるため、常に符号無し整数やキャストで扱いを明確にすること。
- 検算の簡単なPython例:
def op(x):
shifted = x << 2 # 左に2ビットシフト(x*4)
return shifted + x # さらに元のxを加える(結果は5x)
for x in [1,2,3,10]:
print(x, op(x), 5*x)
FAQ
Q1: 「左シフト」と「掛け算」は常に等しいですか?
A1: 理論上は倍に等しいですが、実装上は符号、データ幅、オーバーフロー規則に注意が必要です。
A1: 理論上は倍に等しいですが、実装上は符号、データ幅、オーバーフロー規則に注意が必要です。
Q2: 加算の順序を逆にしたら結果は変わりますか?
A2: 「先にを加えてからシフトする」と「シフトしてからを加える」は一般に異なる結果になります。問題文の順序に従って解きます。
A2: 「先にを加えてからシフトする」と「シフトしてからを加える」は一般に異なる結果になります。問題文の順序に従って解きます。
Q3: 負の数でも同じですか?
A3: 符号付き負数では算術右シフトと左シフトの扱いが異なる場合があり、左シフトによる符号ビットの扱いやオーバーフローに注意が必要です。
A3: 符号付き負数では算術右シフトと左シフトの扱いが異なる場合があり、左シフトによる符号ビットの扱いやオーバーフローに注意が必要です。
関連キーワード: ビット演算、左シフト、掛け算に変換、2進数、オーバーフロー、算術シフト、論理シフト、シフト演算、C言語シフト注意点

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

