問2 2 進数の文字列を整数に直す

基本情報​技術者試験 令和6年度 公開問題 科目B、全6問のうちの問2。

出典:令和6年度 基本情報技術者試験 公開問題 科目B 問2(プログラムは原本の画像を文字に書き起こし、字下げは 1 段を空白 2 つで表した。空欄は[  ]で表した)

次のプログラム中の[  ]に入れる正しい答えを,解答群の中から選べ。

関数 convDecimal は,引数として与えられた,“0”と“1”だけから成る,1 文字以上の文字列を,符号なしの 2 進数と解釈したときの整数値を返す。例えば,引数として“1⁠0⁠0⁠1⁠0”を与えると 1⁠8 が返る。

関数 convDecimal が利用する関数 int は,引数で与えられた文字が“0”なら整数値 0 を返し,“1”なら整数値 1 を返す。

〔プログラム〕
○整数型: convDecimal(文字列型: binary)
整数型: i, length, result ← 0
length ← binaryの文字数
for (i を 1 から length まで 1 ずつ増やす)
result ← [  ]
endfor
return result
  1. アresult + int(binary の (length - i + 1)文字目の文字)
  2. イresult + int(binary の i文字目の文字)
  3. ウresult × 2 + int(binary の (length - i + 1)文字目の文字)
  4. エresult × 2 + int(binary の i文字目の文字)
答えと解説を開く

正解はエです。

2 進数では、1 桁左にずれるごとに重みが 2 倍になります。左から読むなら、新しい桁を読むたびにそれまでの値を 1 桁左へずらす (2 倍する) と、新しい桁を 1 の位に足せます。i は 1 から length まで増えるので、i 文字目を読めば左から順です。だから result × 2 + int(binary の i文字目の文字) です。“1⁠0⁠0⁠1⁠0” で追います。result は 0 から始まり、i = 1 で 0 × 2 + 1 = 1、i = 2 で 1 × 2 + 0 = 2、i = 3 で 2 × 2 + 0 = 4、i = 4 で 4 × 2 + 1 = 9、i = 5 で 9 × 2 + 0 = 1⁠8 です。問題文の 1⁠8 と合います。正解はエです。

ほかの選択肢が違う理由

  • ア2 倍していないので、各桁の 0 と 1 を足すだけです。“1⁠0⁠0⁠1⁠0” では 1 の個数の 2 が返ります。
  • イアと同じく 2 倍していないので、1 の個数を数えるだけです。“1⁠0⁠0⁠1⁠0” では 2 が返ります。
  • ウ2 倍はしていますが、右の桁から読んでいます。左から読む形の式に右から文字を渡すので、文字列を逆に読んだ “0⁠1⁠0⁠0⁠1” の値になります。0、1、2、4、9 と進み、9 が返ります。

仕組み

この「それまでの値に基数を掛けて次の桁を足す」やり方は、1⁠0 進数でも同じです。“1⁠2⁠3” は ((1 × 1⁠0) + 2) × 1⁠0 + 3 です。

右の桁から読むなら、桁ごとの重み (1、2、4、8 …) を別の変数で持って掛ける必要があります。左から読むほうが変数が少なく済みます。

この問に出る言葉