基本情報技術者 2016年 春期 午前(科目A) 問01
問題文
数値を2進数で格納するレジスタがある。このレジスタに正の整数を設定した後、“レジスタの値を2ビット左にシフトして、を加える”操作を行うと、レジスタの値はの何倍になるか。ここで、あふれ(オーバフロー)は、発生しないものとする。
選択肢
ア:3
イ:4
ウ:5(正解)
エ:6
🔒 解説は解答すると表示されます
左シフトと加算による乗算効果【午前解説】
正解の理由
2ビット左シフトは各ビットを2つ左へずらし、空いた下位ビットに0を入れる操作であり、数値としては倍に相当します。操作の順序が「レジスタの値を2ビット左にシフトして、を加える」なので、
となり、最終的に元のの5倍になります。したがって正解は ウ(5)です。
解法ステップ
- 問題文から操作の順序を確認:「シフトして、を加える」。
- 2ビット左シフトの意味を数値的に解釈:。
- シフト後に元のを加算:。
- 計算して簡約:。オーバフローは発生しない前提なのでこれが最終値。
選択肢別の誤答解説
- ア: 3 — これは「1ビット左シフト(2倍)してからを加える」場合の結果と混同した考え方です。問題は2ビット左シフトなので当てはまりません。
- イ: 4 — これは左シフトのみ(倍)を最終答と誤認したケースです。問題ではその後にをさらに加えるため、4倍だけでは不十分です。
- ウ: 5 — 正解。2ビット左シフトでになり、さらにを加えるためとなります。
- エ: 6 — おそらく「左シフトで4倍になりさらに2倍分を加える(または別の誤った加算)」といった誤解に基づく答えで、操作の意味から導かれる正しい式には合致しません。
よくある誤解
- 左シフト=「1ビットごとに2倍」との一般理解は正しいが、問題の「2ビット左シフト」は2回の2倍ではなく一括で倍である点を確認しない誤答。
- 「加える」順序を逆に捉え、先にを加えてからシフトすると別結果(回シフトでは等の誤解)になると考えるミス。
- 符号付きやオーバーフロー処理を意識せず、ビット溢れ(ラップアラウンドや飽和)を念頭に置かない点で実機の挙動と混同する誤り。
補足コラム
- 左シフトはハードウェア的に乗算より高速な場合が多く、は通常と等価です(符号やオーバーフロー扱いには注意)。
- プログラミングでの確認(Python例):整数型は任意精度なのでオーバーフローは起こりません。以下で操作を確認できます。
def shift_then_add(x):
shifted = x << 2 # 2ビット左シフト(4倍)
return shifted + x
for x in [1, 2, 5, 10]:
print(x, shift_then_add(x), "=", 5*x)
- 符号付き整数での右シフト(算術シフト)と左シフトの挙動は異なるため、負の数や固定ビット幅の環境では注意が必要です。
FAQ
Q1: 「もし操作が『xを加えてから2ビット左にシフト』だったら?」
A1: その場合はのように異なる結果になります。順序は結果に直接影響します。
Q2: 正負の数やオーバーフローがあると結果は変わりますか?
A2: はい。固定ビット幅の符号付き整数やオーバーフローの処理方式によってはラップや飽和が起き、単純な倍の関係が崩れることがあります。
Q3: 「左にビットを追加する(桁を付け加える)」と解釈するのは誤りですか?
A3: 実際には左シフトは下位に0を入れる操作で、数値的には倍算に対応します。文字列的に桁を付け足すイメージと混同しないでください。
A1: その場合はのように異なる結果になります。順序は結果に直接影響します。
Q2: 正負の数やオーバーフローがあると結果は変わりますか?
A2: はい。固定ビット幅の符号付き整数やオーバーフローの処理方式によってはラップや飽和が起き、単純な倍の関係が崩れることがあります。
Q3: 「左にビットを追加する(桁を付け加える)」と解釈するのは誤りですか?
A3: 実際には左シフトは下位に0を入れる操作で、数値的には倍算に対応します。文字列的に桁を付け足すイメージと混同しないでください。
関連キーワード: ビット演算、左シフト、シフト演算、2進数、レジスタ、乗算最適化、オーバーフロー

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

