令和6年度 ITパスポート試験 公開問題 問85

関数 binaryToInteger は,1桁以上の符号なし2進数を文字列で表した値を引数 binaryStr で受け取り,その値を整数に変換した結果を戻り値とする。例えば,引数として “100” を受け取ると,4を返す。

プログラム中の a, b に入れる字句の適切な組合せはどれか。

プログラムの擬似コード
図の説明テキスト

2進数文字列を整数に変換する関数 binaryToInteger の擬似コード。文字列 binaryStr を引数として受け取り、末尾から1文字ずつ処理するforループで構成されている。ループ内で変数 exponent と integerNum を計算する処理の一部が空欄 a および b になっている。

解答・解説

正解: エ. a: 2 の (i - 1) 乗, b: integerNum + digitNum × exponent

このプログラムは、2進数の文字列を1文字ずつ取り出し、対応する10進数の値に変換して合算する処理を行っています。問題文の例にある引数「"100"」を用いて処理を追ってみましょう。引数の文字数は3なので、変数 i は 1 から 3 まで1ずつ増えます。文字を末尾から取り出すため、i=1のときは0、i=2のときは0、i=3のときは1を取り出し、それぞれの値を digitNum に代入します。これらを10進数に変換するには、各桁の値(digitNum)にその桁の重み(exponent)を掛けたものを足し合わせる必要があります。このことを踏まえて空欄を考えます。空欄 a について:2進数における各桁の重みは、一番右の桁(末尾)から順に 20,21,22,...2^0, 2^1, 2^2, ... となります。プログラムでは、ループ変数 i が 1 から始まり、末尾から i 番目の文字を処理しています。したがって、末尾から i 番目の桁の重み exponent は 2i−12^{i-1} と表すことができます。よって、空欄 a には 2i−12^{i-1} が入ります。空欄 b について:10進数に変換した最終的な値 integerNum は、各桁の数値(digitNum)と、その桁の重み(exponent)を掛け合わせたものを、すべて合算した値になります。ループの中で integerNum に現在の桁の値を加算していくため、integerNum の元の値に digitNum × exponent を足す必要があります。よって、空欄 b には integerNum + digitNum × exponent が入ります。

各選択肢の解説

  • ア:a の重みの計算が 2i−12^i - 1 となっており誤りです。また、b で integerNum を掛け算で更新していますが、これでは正しく各桁の値を合算できません。
  • イ:a の重みの計算が 2i−12^i - 1 となっており誤りです。例えば i=1 のとき重みが 11、i=2 のとき 33、i=3 のとき 77 となり、2進数の重み(1, 2, 4)として正しくありません。
  • ウ:b で integerNum を掛け算で更新しており誤りです。各桁の値を合算するためには加算(+)を用いる必要があります。
  • エ:正解です。末尾から i 番目の重みが 2i−12^{i-1} であり、それを順次加算していく処理になっています。

Spineチーム