基本情報技術者試験 平成31年度 春期 午前 問1
小数点以下の数値が含まれる 2 進数の計算問題。
--------------------------
平成31年度 春期 午前 問1
10 進数の演算式 7 ÷ 32 の結果を 2 進数で表したものはどれか。
ア 0.001011
イ 0.001101
ウ 0.00111
エ 0.0111
---------------------------
解説
試験の開始と同時に計算が必要な問題が目に入ると少し焦る。
コンピュータは割り算が苦手なので、掛け算にしてみるとわかりやすくなる。
7 × 1/32 = 7/32
力技でいくなら、答えの 4 択を書き換えてしまうとよい。時間もそれほどかからない。
2 進数で小数点以下の数値は以下のように 2 のマイナス何乗で表す。
1 → 20 = 1
0.1 → 2-1 = 1/2 = 16/32
0.01 → 2-2 = 1/4 = 8/32
0.001 → 2-3 = 1/8 = 4/32
0.0001 → 2-4 = 1/16 = 2/32
0.00001 → 2-5 = 1/32
足したら 7/32 になりそうな組み合わせを取ると、4/32 + 2/32 + 1/32 でちょうどになるので、2 進数で表して 0.001 + 0.0001 + 0.00001 = 0.00111 となり正解は選択肢ウ。
力技でない方法も考えてみる。
2 進数は全てを 2 の何乗で表すので、問題の演算を 2 の何乗の形だけで表してみる。
7×1/32
= (4 + 2 + 1) × 32-1
= [22 + 21 + 20] × 2-5
= [2-3 + 2-4 + 2-5]
なので、力技の時の変換を逆に使えば 0.00111 になる。
焦ってるときは力技の方がミスなく早いときが多いけど。
2進数の演算を見ると聖剣伝説 3(SFC版)の隠しボスを思い出す(黒いやつ)。
理不尽な強さで正攻法だと苦労するけど、敵を回復させるという普通はやらないことをすると次の攻撃でほば倒せるという裏技があった。
このカラクリは 2 進数の考え方で理解できる。昔のゲームはわずかなビットも惜しむため、このゲームでHPを表すビット数はこの黒いやつのHPを表すギリギリの 16 ビットで設計されている。
16 ビットで表せる数の最大は 65535 となる。
1111111111111111 = 65535
黒いやつは HPが 65500 くらいなので、40 ほど回復させてやると 65540 となり、これを表すには
10000000000000101 = 65540
と 17 桁目が必要になる。
ただし HP の表現には 16 ビットしか割り当ててないため、17 ビット目がないものとなり、
0000000000000101 = 5
と回復したように見えて一瞬でHP 5の瀕死状態。
このバグで問題なのはビット数ではなく 17 ビット目が必要になった場合の処理をプログラムで回避していないことにあるけど、ネタで残したのかな、と想像してみたり。
最近 Switch 向けにリメイクがでるみたいだけど、ネタとして残ってないかな。
前後の問題はこちら。