PR

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

基本情報技術者試験 令和6年度 科目B 公開問題(過去問) 問2 について解説します。

問題

問2 次のプログラム中の〔  〕に入れる正しい答えを、解答群の中から選べ。

 関数 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文字目の文字)

解説・解答

convDecimalの引数 binary には、”0″と”1″だけからなる文字列(例: “10010”)が渡されます。これを2進数とみなして、10進数の整数値に変換して返す関数が convDecimal になります。
convDecimalで利用される補助関数 int は
 引数が “0” なら 0 を返す
 引数が “1” なら 1 を返す
という、文字を数値にするだけの関数です。

ここでは2進数を左から順に1文字ずつ読んで10進数に変換する方法を考えます。桁の重みで考えると

このことから、次の処理を for文で繰り返すことで2進数を10進数に変換することができます。
 ・今まで読んだ部分の値を result とする。(resultの初期値は0。)
 ・次のビットの値を1つ読む。(0 か 1)
 ・今までの値(result)を2倍して、そこに読んだビットの値を足す。
式で書くと次のようになります。
 result ← result × 2 + 読んだビットの値
上記より、プログラムの〔  〕に入るのは、選択肢エの result × 2 + int(binary の i文字目の文字) になります。

例として 2進数 “10010” を左から処理してみます。
binary = “10010”(長さ 5)とし、i を1~5で回します。binary の i文字目は左から i 番目の文字です。result = 0 が初期値です。
 1回目(i = 1, 文字は “1”)
  result = 0 × 2 + 1 = 1
 2回目(i = 2, 文字は “0”)
  result = 1 × 2 + 0 = 2
 3回目(i = 3, 文字は “0”)
  result = 2 × 2 + 0 = 4
 4回目(i = 4, 文字は “1”)
  result = 4 × 2 + 1 = 9
 5回目(i = 5, 文字は “0”)
  result = 9 × 2 + 0 = 18
最終的に result = 18 となり、問題文の通りになります。

以上により、この問題の解答は「エ」になります。