ITの基礎知識|ITパスポート・基本情報

基本情報技術者 令和6年公開問題 科目B 問2

2026.07.08

科目Bに共通する注意事項(表記ルールなど)については、下記のリンク先を参照してください。

基本情報技術者 令和6年公開問題 科目Bの注意事項


問題

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

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

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

[プログラム]

○整数型: convDecimal(文字列型: binary)
  整数型: i, length, result ← 0
  length ← binaryの文字数
  for (i を 1 から length まで 1 ずつ増やす)
    result ← [_空欄_]
  endfor
  return result

 

解答群

  • ア result + int(binary の (length − i + 1)文字目の文字)
  • イ result + int(binary の i文字目の文字)
  • ウ result × 2 + int(binary の (length − i + 1)文字目の文字)
  • エ result × 2 + int(binary の i文字目の文字)

Show answer

解答

解説

2進数の文字列を先頭(左)から1文字ずつ読みながら10進数に変換する定番アルゴリズムです。ポイントは次の漸化式です。

$ result_{新} = result_{旧} \times 2 + (次の桁の値)$

「これまでの結果を 2 倍して,新しい桁を足す」を繰り返すと,桁の重み付けが自動的に行われます。"10010"(=18)でをトレースしてみます。i 文字目は先頭からの位置です。

  • i=1:result = 0×2+1 = 1
  • i=2:result = 1×2+0 = 2
  • i=3:result = 2×2+0 = 4
  • i=4:result = 4×2+1 = 9
  • i=5:result = 9×2+0 = 18

となり、最終的に"10010"から10進数の"18"という値が導き出されます。

他の選択肢を確認します。

  • ア:(length − i + 1)文字目は末尾から読む指定です。2倍する処理がなく,単に各桁の 0/1 を合計するだけ("10010" なら 2)になり誤りです。
  • イ:アと同様,桁の重みが反映されず 0/1 の合計になるため誤りです。
  • ウ:「2倍して足す」方式は正しいのですが,読む向きが末尾からになっています。"10010" を逆順 "01001" として解釈してしまい,0→0→1→2→4→9 で 9 が返るため誤りです。

「×2+桁」方式は上位桁から読むときに成立する,という対応関係を押さえておきましょう。

逆に下位桁から読む場合は,桁ごとに重み(1, 2, 4, 8, …)を掛けて足し込む実装になります。