基本情報技術者 2019年 秋期 午前(科目A) 問01
問題文
次の流れ図は、10進整数()を8桁の2進数に変換する処理を表している。2進数は下位桁から順に、配列の要素NISHIN(1)からNISHIN(8)に格納される。流れ図のa及びbに入れる処理はどれか。ここで、 div はを2で割った商の整数部分を、 mod はを2で割った余りを表す。


選択肢
ア:
イ:
ウ:
エ:(正解)
10進整数を8桁の2進数に変換する処理【午前2 解説】
要点まとめ
- 結論:各反復で下位ビットを配列に格納し、その後を2で割った商に置き換えることが正しい手順です。
- 根拠:が現在の下位ビットを与え、で次の下位ビットを次の反復で得られます。順序を入れ替えると情報が失われます。
- 差がつくポイント:下位ビットから格納すること(リトルエンディアン)と,格納→更新の順序を厳密に守る点で他の受験者と差が付きます。
正解の理由
流れ図は下位桁から順にNISHIN(1)〜NISHIN(8)に格納すると明示しています。1反復で現在の下位ビットはで得られるため、まず
NISHIN(k) ← j mod 2
と格納します。その後でを右に1ビット分シフトする操作に相当する
j ← j div 2
を行えば、次の反復で次の下位ビット(元のの2進表現の次の桁)を取り出せます。したがって選択肢はエが正解です。
よくある誤解
- 「先にをにしてからを取る」すると現在の下位ビットを失い、1桁ずつ左にズレた誤ったビット列になります。
- 「NISHINにを入れる」と考える誤り:はビット列そのものではなく次の状態の数値であり、配列へは余り(ビット)を入れるべきです。
- エンディアンの混同:問題は下位桁から格納する(NISHIN(1)がLSB)ため、上位から格納する想定で解くと間違えます。
解法ステップ
- 初期値を入力し、ループ変数を1から8まで繰り返す。
- 各反復で現在の下位ビットを得る:bit = 。
- NISHIN(k) にそのビットを格納する:NISHIN(k) ← bit。
- 次にを右に1ビットシフト(整数除算):。
- 8回繰り返した後、NISHIN(1)〜NISHIN(8)に下位→上位の順で2進8桁が格納される。
簡単な擬似コード例:
# j: 0 < j < 100
for k in range(1, 9): # k = 1..8
NISHIN[k] = j % 2 # 下位ビットを格納
j = j // 2 # 右へ1ビットシフト
具体例(j=13 の場合):
- 13 mod 2 = 1 → NISHIN(1)=1, j→13 div 2 = 6
- 6 mod 2 = 0 → NISHIN(2)=0, j→3
- 3 mod 2 = 1 → NISHIN(3)=1, j→1
- 1 mod 2 = 1 → NISHIN(4)=1, j→0
- 残りは0で埋められ、NISHIN = [1,0,1,1,0,0,0,0](下位から上位)
選択肢別の誤答解説
- ア:a に「j ← j div 2」、b に「NISHIN(k) ← j mod 2」
誤り。先にを更新すると現在の下位ビットを失い、格納されるビットが1回左へずれます。 - イ:a に「j ← j mod 2」、b に「NISHIN(k) ← j div 2」
誤り。は0か1の値しか持たずその後を失うため、以降の繰り返しで正しくシフトできません。 - ウ:a に「NISHIN(k) ← j div 2」、b に「j ← j mod 2」
誤り。配列に格納すべきは余り(ビット)であり、商を格納してはいけません。さらにを余りに置き換えると次反復で正しいビットを得られません。 - エ:a に「NISHIN(k) ← j mod 2」、b に「j ← j div 2」
正解。現在の下位ビットを格納してからを右シフトするので、各桁が正しく配列に入ります(正解: エ)。
補足コラム
- ビット演算を用いると同様の処理は高速に書けます。例えば
NISHIN[k] = j & 1; j >>= 1
はビット論理演算で同等です。 - このアルゴリズムはリトルエンディアン(下位から格納)です。もし上位から格納する必要があれば、ループの向きや格納インデックスを逆にします。
- jが0になった後もループを回すことで上位桁は自動的に0で埋められ、固定長(8桁)の2進表現が得られます。
FAQ
Q1: なぜ先に余りを格納するのですか?
A1: 先に余り(下位ビット)を格納し、その後で商に更新することで次の下位ビットを取り出せるためです。順序を逆にすると情報が失われます。
A1: 先に余り(下位ビット)を格納し、その後で商に更新することで次の下位ビットを取り出せるためです。順序を逆にすると情報が失われます。
Q2: jが0になったらどうなりますか?
A2: 以降の反復ではかつのままで、NISHINに0が格納され続けます。これにより上位ビットは0で埋められます。
A2: 以降の反復ではかつのままで、NISHINに0が格納され続けます。これにより上位ビットは0で埋められます。
Q3: ビット演算で書くメリットは?
A3: 演算速度と可読性が向上します。言語によっては
A3: 演算速度と可読性が向上します。言語によっては
j & 1(下位ビット取得)と
j >>= 1(右シフト)で簡潔に表現できます。
関連キーワード: 2進数、10進整数、div、mod、ビット変換、ループ、配列、下位ビット、リトルエンディアン、シフト演算

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

