スポンサーリンク

基本情報技術者試験 | 令和6年度(科目B) [問2] 過去問解説

問題

問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” の場合、処理は以下のようになります:

  1. result = 0
  2. 1文字目 ‘1’ → result = 0×2 + 1 = 1
  3. 2文字目 ‘0’ → result = 1×2 + 0 = 2
  4. 3文字目 ‘0’ → result = 2×2 + 0 = 4
  5. 4文字目 ‘1’ → result = 4×2 + 1 = 9
  6. 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桁ずつ処理するロジックを手で書いて練習すると効果的です。特に「左から処理するか右から処理するか」「何倍するか」といった点を意識すると、選択肢の違いに惑わされずに済みます。