基本情報 平成29年度 春期 問1:テクノロジ系に関する問題
数値を 2 進数で表すレジスタがある。このレジスタに格納されている正の整数 ヶ を 10 倍にする操作はどれか。ここで, 桁あふれは起こらないものとする。
- a*を2ビット左にシフトした値に* を加算し, 更に1ビット左にシフトする。正答
- b*を2ビット左にシフトした値に*を加算し, 更に2 ビット左にシフトする。
- c*を3ビット左にシフトした値と, *ぇを2ビット左にシフトした値を加算する。
- d*を3ビット左にシフトした値に*を加算し, 更に 1 ビット左にシフトする。
AI解説(初心者・標準・上級)
理解度に合わせて3レベルの解説を無料で読めます。
答えは a です。
2進数を「左に1ビットずらす=2倍」になる、というのが超基本ルール(10進数で言う「0を1個足す」みたいなもの)。
だから 10倍 = 8倍 + 2倍 と分解して作ります。
- 2ビット左シフト=×4、それに元のxを足す=×5
- さらに1ビット左シフト=×2 → 合計 ×10 ✨
👉 覚え方:左シフト1回=×2。10倍は「×5してから×2」で作る。
ほかの選択肢:b は×(4+1)×4=20倍、c は×8+×4=12倍、d は×(8+1)×2=18倍 で、どれも10倍にならない。
なぜこれが正解か
正解は a。2進数の左1ビットシフトは×2に等しい。10倍を作るには 10 = (4 + 1) × 2 = (x×4 + x) × 2 と分解する。これを操作で表すと、xを2ビット左シフト(×4)→ xを加算(×5化)→ 1ビット左シフト(×2)。結果はx×10。
各選択肢の解説
- a:(x×4 + x) × 2 = x×10 → 正解。
- b:(x×4 + x) × 4 = x×20。
- c:x×8 + x×4 = x×12。
- d:(x×8 + x) × 2 = x×18。
覚え方・ひっかけ注意
「nビット左シフト=×2ⁿ」が鉄則。10倍は素数分解で 2×5、5は (4+1) または (2+2+1) で作れる。シフト演算は乗算より高速なので組込み系でも頻出。桁あふれ条件「起こらない」は最上位ビットを気にしなくてよい合図。
理論的背景
シフト演算は乗除算より大幅に高速で、組込み系・DSP・暗号処理で多用される。一般に定数倍 N は N = Σ2^k の和で表現でき、ビット表現 (popcount) の数だけ加算が必要になる。10₁₀ = 1010₂ なので2回の加算(または1回の加算+1回のシフト)で実現できる。コンパイラはこれを strength reduction(強度低減) 最適化として自動適用する。
実装パターンの比較
- (x<<3) + (x<<1) = 8x + 2x = 10x(2回シフト+1回加算)
- ((x<<2) + x) << 1 = 5x<<1 = 10x(aの方式、2回シフト+1回加算)
- x*10 を符号付きで安全に書くなら、桁あふれ検査が必要。
両者の命令数は同等だが、aの方式は中間結果が小さく キャリーチェーンが短い メリットがある。
試験での位置づけ
FEの基礎理論「コンピュータシステム」分野で毎期出題級の超頻出。シフト・論理演算・浮動小数点正規化・補数表現はセットで習得すべき。応用情報・高度ではCRC・GF(2)体の演算まで発展する。
選択肢の発展補足
コンパイラの定数除算最適化(Granlund-Montgomery法)では、除数の逆数を固定小数点で乗算してシフトする手法が使われる。シフトを使った乗算最適化はARM Cortex等の組込みCPUで特に効果的。負数の右シフトは算術シフト(符号拡張)と論理シフト(0埋め)で結果が異なる点も試験頻出。
出典:IPA(情報処理推進機構)公式 基本情報技術者試験 平成29年度 春期 問1/ 公的機関配布資料につき出典明記の上引用。解説は合格ナビによる独自AI解説です。