問題
問2
次のプログラム中の【 】に入れる正しい答えを、解答群の中から選べ。
- 関数 convDecimal は、引数として与えられた、“0”と“1”だけから成る、1文字以上の文字列を、符号なしの2進数と解釈したときの整数値を返す。例えば、引数として“10010”を与えると18が返る。
- 関数 convDecimal が利用する関数 int は、引数で与えられた文字が“0”なら整数値 0 を返し、“1”なら整数値 1 を返す。

- result + int(binary の (length − i + 1)文字目の文字)
- result + int(binary の i文字目の文字)
- result × 2 + int(binary の (length − i + 1)文字目の文字)
- result × 2 + int(binary の i文字目の文字)
[出典:基本情報技術者試験 令和6年度(科目B) 問2]
スポンサーリンク
正解
正解は「エ」です。
解説
本問は、2進数の文字列を10進数に変換する関数 convDecimal の処理ロジックの穴埋め問題です。
入力される文字列は “0” または “1” からなる2進数です。これを左から順に読み取って10進数に変換するためには、各桁を左から処理し、「現在の値を2倍し、そこに新たに読んだ桁の値を加える」という操作を繰り返せばよいです。
たとえば “10010” の場合、処理は以下のようになります:
- result = 0
- 1文字目 ‘1’ → result = 0×2 + 1 = 1
- 2文字目 ‘0’ → result = 1×2 + 0 = 2
- 3文字目 ‘0’ → result = 2×2 + 0 = 4
- 4文字目 ‘1’ → result = 4×2 + 1 = 9
- 5文字目 ‘0’ → result = 9×2 + 0 = 18
このように、毎回 result を2倍して、現在の桁の値(0または1)を足す処理が必要です。これはつまり次のような式です:
result ← result × 2 + int(binaryのi文字目の文字)
この内容と一致する選択肢は「エ」です。
一方で他の選択肢は、「2倍していない」「桁の順序が逆」「加算だけしている」などの誤りがあり、正しい変換処理になりません。
ア(result + int(binary の (length − i + 1)文字目の文字)):
文字列の末尾から読んでいる点は正しいですが、result を2倍せずに加算しているため、正しい2進数変換になりません。
イ(result + int(binary の i文字目の文字)):
左から読んでいますが、2倍の処理が無く、2進数の桁の重みを表現できません。
ウ(result × 2 + int(binary の (length − i + 1)文字目の文字)):
2倍の処理は正しいものの、文字列を逆順で処理しており、順序が合わず誤りになります。
難易度
2進数から10進数への変換という基本的なアルゴリズムがベースになっており、処理の流れを理解していれば正解しやすい問題です。ただし、桁の順序や倍加処理の有無など、細かな違いが選択肢に含まれているため、注意深く比較する力が必要です。
スポンサーリンク
用語補足
2進数:
0と1の2種類の数字で構成される数値表現で、コンピュータの内部処理の基礎です。例えば “1010” は 2進数で、10進数では 10 です。
int関数:
文字列型の “0” や “1” を整数値 0 や 1 に変換する関数です。この処理があることで、文字列から計算が可能になります。
繰返し処理(for 文):
特定の処理を決められた回数だけ繰り返す構文です。本問では文字列の各文字を順に処理するために使用されています。
対策
2進数から10進数への変換手順を理解し、1桁ずつ処理するロジックを手で書いて練習すると効果的です。特に「左から処理するか右から処理するか」「何倍するか」といった点を意識すると、選択肢の違いに惑わされずに済みます。