基本情報技術者 2017年 秋期 午前(科目A) 問01
問題文
数値を2進数で表すレジスタがある。このレジスタに格納されている正の整数を10倍にする操作はどれか。ここで、桁あふれは起こらないものとする。
選択肢
ア:を2ビット左にシフトした値にを加算し、更に1ビット左にシフトする。(正解)
イ:を2ビット左にシフトした値にを加算し、更に2ビット左にシフトする。
ウ:を3ビット左にシフトした値と、を2ビット左にシフトした値を加算する。
エ:を3ビット左にシフトした値にを加算し、更に1ビット左にシフトする。
数値を左シフトと加算で10倍にする操作はどれか【午前2 解説】
要点まとめ
- 結論:x を 2 ビット左にシフトして得た値に x を加え、更に 1 ビット左にシフトする操作が x を 10 倍にします。
- 根拠:左シフト 1 回が ×2、2 回が ×4 に対応するため となる計算で示せます。
- 差がつくポイント:シフトと加算の順序を正しく読み取り、各選択肢を代数的に置き換えて係数を比較することが合格の鍵です。
正解の理由
正解は ア です。操作を式で表すと、まず を 2 ビット左にシフトして を作り、これに を加えて とし、さらに 1 ビット左にシフトすると になります。すなわち
であり、問題の目的を満たします。
よくある誤解
- シフトを「桁送り」的にイメージして順序を入れ替えてしまい、先にシフトした値と後でシフトする回数を混同するミス。
- 「2 ビット左にシフトした値に x を加算し、更に 2 ビット左にシフトする」を一見似ているため見落としてしまい、係数を正しく計算しないこと。
- シフト=加算や乗算の直感だけで判断し、まず式に落とし込んで検算しないこと。
解法ステップ
- 「n ビット左にシフトする」は 倍と解釈する。例:1 ビット左シフト=×2、2 ビット=×4、3 ビット=×8。
- 各選択肢を代数式で表す。例:アは 。
- 式を展開して係数を求める。例:アは 。
- 求めた係数が 10 になっている選択肢を正解とする。
選択肢別の誤答解説
- 正解: ア — は 、さらに で 。正しい。
- イ — は 、さらに (×4)で 。10倍にはならない。
- ウ — が 、 が 、これらを加算すると 。誤り。
- エ — が 、これに を加えて 、さらに (×2)で 。誤り。
補足コラム
ビットシフトと加算を組み合わせることで、掛け算命令を使わずに定数倍を効率的に実装できます。組込みや古いプロセッサでは特に有効です。例えば 10 倍は と分解して とする方法も考えられますが、問題の選択肢は「シフト→加算→シフト」の順序で記述されている点に注意が必要です。実際のコード例(検算):
def times_10_via_choice_a(x):
return ((x << 2) + x) << 1
for i in range(1,6):
print(i, times_10_via_choice_a(i), i*10)
FAQ
Q1: 左シフトは常に乗算と同じですか?
A1: 無符号値や桁あふれが起こらない範囲では左シフトは 倍と等価です。符号付きやオーバーフローの扱いは実装依存です。
Q2: 選択肢を見てすぐにわかるコツは?
A2: まず「何倍になるか」を係数で比較する。シフトを乗数に換算して足し算・掛け算で係数を計算します。
Q3: 10 を別の分解で表す方法は?
A3: 10 = 8+2、または 10 = 5×2 のように分解できます。実装によって効率的な組合せを選びます。
A1: 無符号値や桁あふれが起こらない範囲では左シフトは 倍と等価です。符号付きやオーバーフローの扱いは実装依存です。
Q2: 選択肢を見てすぐにわかるコツは?
A2: まず「何倍になるか」を係数で比較する。シフトを乗数に換算して足し算・掛け算で係数を計算します。
Q3: 10 を別の分解で表す方法は?
A3: 10 = 8+2、または 10 = 5×2 のように分解できます。実装によって効率的な組合せを選びます。
関連キーワード: ビットシフト、左シフト、2進数、乗算最適化、レジスタ演算、桁あふれ、シフト演算、加算による乗算代替

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

