マナビング基本情報技術者

二進数変換で下位桁をどう順に格納するか

基本情報技術者試験 令和元年度秋期 午前 問1 / アルゴリズムとプログラミング › アルゴリズム

過去問にチャレンジ

令和元年度秋期 午前 問1

次の流れ図は,10進整数 j(0<j<100) を8桁の2進数に変換する処理を表している。2進数は下位桁から順に,配列の要素 NISHIN(1) から NISHIN(8) に格納される。流れ図のa及びbに入る処理はどれか。ここで,j div 2 はjを2で割った商の整数部分を,j mod 2 はjを2で割った余りを表す。

令和元年度秋期 午前 問1の図
令和元年度秋期 午前 問1の図
  1. ア

    a:j ← j div 2 b:NISHIN(k) ← j mod 2

  2. イ

    a:j ← j mod 2 b:NISHIN(k) ← j div 2

  3. ウ

    a:NISHIN(k) ← j div 2 b:j ← j mod 2

  4. エ

    a:NISHIN(k) ← j mod 2 b:j ← j div 2

会話形式の解説

講師講師
この流れ図では、配列の最初の要素に何の桁を入れるかが手がかりです。
受験者受験者
下位桁から入れるので、まず二進数の一番右の桁を求めるのですね。
講師講師
はい。現在のjを2で割った余りが、その桁です。商と余りのどちらを先に保存しますか。
受験者受験者
余りを配列に保存してから、jを商に更新します。更新を先にすると、最初の桁が分からなくなります。
講師講師
そのとおりです。先に商へ更新してから余りを格納する組合せでは、元のjの最下位桁を飛ばしてしまいます。
受験者受験者
jを先に余りへ更新する組合せもありますが、それならjには0か1しか残りませんね。
講師講師
はい。その値を2で割った商は0なので、配列に元の数の各桁を記録できません。
受験者受験者
では、商をそのまま配列に入れる組合せはどうですか。
講師講師
商は0か1とは限らず、二進数の一桁として格納する値にはなりません。
受験者受験者
余りをNISHIN(k)に入れ、その後でjを商に更新する組合せが正解のエですね。
講師講師
はい。kが次へ進むたびに、更新後のjから一つ上の桁を取り出せます。
受験者受験者
元の整数を更新する前に余りを保存する、という順序が大切なのですね。
講師講師
その順序です。途中でjが0になっても、残りの余りは0なので、八つの要素を埋められます。

まとめ

正解はエです。現在のjを2で割った余りをNISHIN(k)に保存すると、その時点の下位桁を記録できます。その後でjを商に更新すれば、次の繰返しで一つ上の桁を取り出せます。商への更新を先にすると、元のjの最下位桁を失います。

解答・解説

正解はエです

この問題のテーマ

整数を2進数に変換するとき、各桁を取り出して配列に入れる順序を問う問題です。

解き方の考え方

図ではkを1から8まで増やし、2進数の下位桁から順に格納します。現在のjを2で割った余りが、その時点の最下位桁です。まず余りをNISHIN(k)に保存し、その後でjを商に更新すれば、次の繰返しで一つ上の桁を取り出せます。

選択肢ごとの解説

  1. ×ア  a:j ← j div 2 b:NISHIN(k) ← j mod 2
    先にjを商に更新すると、元のjの最下位桁を保存する前に失います。その後の余りは一つ上の桁に当たるため、NISHIN(1)から正しい順序で格納できません。
  2. ×イ  a:j ← j mod 2 b:NISHIN(k) ← j div 2
    jを余りに更新した時点で、jには0か1しか残りません。その値をさらに2で割った商を格納しても0になり、元の数の各桁を記録できません。
  3. ×ウ  a:NISHIN(k) ← j div 2 b:j ← j mod 2
    jを2で割った商は、2進数の1桁である0か1とは限りません。その商をNISHIN(k)に入れる処理では、求める桁を格納できません。
  4. ○エ  a:NISHIN(k) ← j mod 2 b:j ← j div 2
    aで現在の最下位桁を余りとしてNISHIN(k)に保存します。続くbでjを商に更新するので、kが次へ進むたびに一つ上の桁を格納でき、図の処理に合います。

POINT

  • 2進数の各桁は、現在の整数を2で割った余りから求めます。
  • 元の整数を更新する前に、取り出した桁を保存します。
  • 商を次の整数として繰り返すと、下位桁から上位桁へ進みます。
  • jが0になった後の余りは0なので、残りの配列要素も0で埋まります。

※出典:令和元年度秋期 基本情報技術者試験 午前 問1(一部改変)