ITパスポート試験 / 令和6年度 ITパスポート試験 公開問題 / 問85
certification-simodake-work

令和6年度 ITパスポート試験 公開問題 問85 解説 2進数から10進数への変換

設問図

関数 binaryToInteger は, 1桁以上の符号なし2進数を文字列で表した値を引数 binaryStr で受け取り, その値を整数に変換した結果を戻り値とする。例えば, 引数 として“100”を受け取ると, 4を返す。プログラム中の a, b に入れる字句の適切な 組合せはどれか。 〔プログラム〕 ○整数型: binaryToInteger(文字列型: binaryStr) 整数型: integerNum, digitNum, exponent, i integerNum ← 0 for (i を 1 から binaryStr の文字数 まで 1 ずつ増やす) digitNum ← binaryStr の末尾から i 番目の文字を整数型に変換した値 // 例: 文字“1”であれば整数値1に変換 exponent ← a integerNum ← b endfor return integerNum

選択肢図
  1. ✓ 正答

解説

2進数を10進数に変換する仕組みを、プログラムの変数に当てはめて考える問題です。この問題を解く鍵は、2進数の各桁が持つ重み(1, 2, 4, 8...)がどのように計算されているかを見抜くことにあります。

プログラムの仕組みを理解する

2進数である「100」を例にして、処理の流れを追います。このループは、文字列の末尾(右側)から左へ向かって処理を進めています。

1回目(右端の0): digitNumは0、exponentは1、integerNumに加算される値は0×1=0 2回目(中央の0): digitNumは0、exponentは2、integerNumに加算される値は0×2=0 3回目(左端の1): digitNumは1、exponentは4、integerNumに加算される値は1×4=4

最終的に、integerNumには計算された値が積み上げられていきます。ここで重要なのは、次の桁に進むたびに重み(exponent)が2倍になっているという点です。

思考プロセス:変数の役割を特定する

プログラム内の変数には以下の役割があります。

  • exponent: 2進数の各桁の重み(1, 2, 4, 8...)を管理する変数です。ループが回るたびに2倍にする必要があります。そのため、ループの最後で exponent を 2倍にする処理が必要ですが、このプログラムではその更新処理が記述されていません。しかし、選択肢を吟味すると、加算の手順の中で重みを利用する式が求められています。
  • integerNum: 最終的な合計値を保持する変数です。
  • digitNum: 現在処理している桁の値を保持しています。

設問の a と b を見ると、aで重みを更新し、bでその桁の計算結果を加算するという構造になっています。 aに「exponent × 2」という選択肢がないことから、このコードの構造上、exponentは「重みを表す値」として扱われ、計算結果をintegerNumに足し合わせるプロセスが展開されています。 正解の選択肢「a: exponent × 2」が含まれるパターンが提示されていますが、今回の問題の正解である「a: exponent × 2(※設問の提示では選択肢の記号と内容が整理されています)」を当てはめると、重みを次々に倍にしながら、各桁の値を重みで掛け算し、それを合計していくという2進数から10進数への変換公式が完成します。

プログラミングとアルゴリズムの重要性

この問題は、単なる2進数変換の知識だけでなく、コンピュータが数値をどのように処理しているかというアルゴリズムの基礎を問うています。

私たちが普段使っている10進数は「10の累乗」の和ですが、コンピュータ内部で使われる2進数は「2の累乗」の和です。この変換アルゴリズムを理解しておくと、データ構造の基礎や、ビット演算による効率的な計算方法を学ぶ際に非常に役立ちます。例えば、ネットワークのIPアドレス計算や、プログラミングにおけるフラグ処理など、IT実務の現場では「ビット」を直接意識する場面が少なくありません。

応用と学習の広がり

このようなプログラムのトレースができるようになると、複雑なバグの特定や、効率的なコードの書き方を直感的に判断できるようになります。ループ処理で累乗を計算するこの手法は、あらゆる基数変換に応用可能です。

参考リンク

学習の記録にははてなブックマーク!

気づいたこと・覚えたことをコメントにメモしよう