令和6年度 ITパスポート試験 公開問題 問85
テクノロジアルゴリズム擬似言語・プログラム読解
関数 binaryToInteger は,1桁以上の符号なし2進数を文字列で表した値を引数 binaryStr で受け取り,その値を整数に変換した結果を戻り値とする。例えば,引数として “100” を受け取ると,4を返す。

図の説明テキスト
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進数における各桁の重みは、一番右の桁(末尾)から順に となります。プログラムでは、ループ変数 i が 1 から始まり、末尾から i 番目の文字を処理しています。したがって、末尾から i 番目の桁の重み exponent は と表すことができます。よって、空欄 a には が入ります。空欄 b について:10進数に変換した最終的な値 integerNum は、各桁の数値(digitNum)と、その桁の重み(exponent)を掛け合わせたものを、すべて合算した値になります。ループの中で integerNum に現在の桁の値を加算していくため、integerNum の元の値に digitNum × exponent を足す必要があります。よって、空欄 b には integerNum + digitNum × exponent が入ります。
各選択肢の解説
- ア:a の重みの計算が となっており誤りです。また、b で
integerNumを掛け算で更新していますが、これでは正しく各桁の値を合算できません。 - イ:a の重みの計算が となっており誤りです。例えば
i=1のとき重みが 、i=2のとき 、i=3のとき となり、2進数の重み(1, 2, 4)として正しくありません。 - ウ:b で
integerNumを掛け算で更新しており誤りです。各桁の値を合算するためには加算(+)を用いる必要があります。 - エ:正解です。末尾から
i番目の重みが であり、それを順次加算していく処理になっています。