10進数での「10分の1」を2進表現したものとして最も適切なものはどれか。ただし、以下の2進表現では、小数点以下16位までを示している。
  • 0.0000011001100110
  • 0.0000110011001100
  • 0.0001100110011001
  • 0.0011001100110011
  • 0.0110011001100110

技術士の過去問 平成27年度(2015年) 基礎科目「情報・論理に関するもの」 問9 – 過去問ドットコム

10進数の 0.1 (=1/10)を2進数にすると、繰り返し「0011」が現れる無限循環小数になります:

0.1₁₀ = 0.0001 1001 1001 1001 …₂
         ↑↑↑↑ ↑↑↑↑ ↑↑↑↑ …

小数部を2倍して「整数部」を取り出す方法で16ビット分まで求めると、

ステップ 倍算後の値 整数部 新たな残り
1 0.1 × 2 = 0.2 0 0.2
2 0.2 × 2 = 0.4 0 0.4
3 0.4 × 2 = 0.8 0 0.8
4 0.8 × 2 = 1.6 1 0.6
5 0.6 × 2 = 1.2 1 0.2
6 0.2 × 2 = 0.4 0 0.4
7 0.4 × 2 = 0.8 0 0.8
8 0.8 × 2 = 1.6 1 0.6
16

この手順で得られる上位16ビットは

0001 1001 1001 1001

すなわち

0.0001100110011001₂

となります。

よって、選択肢の中では③「0.0001100110011001」が最も適切です。

 

解説もお願いします

以下、なぜ③の「0.0001100110011001₂」が正しいか、その手順とポイントを解説します。


1. 0.1₁₀ を 2進に直す基本手順:繰り返し ×2

  1. 小数部(初めは0.1)に2をかける
  2. 結果の整数部(0か1)が、次のビット
  3. 残りの小数部をまた2倍して、同じ操作を繰り返す
ステップ 倍算後の値 整数部(ビット) 新たな小数部
1 0.1 × 2 = 0.2 0 0.2
2 0.2 × 2 = 0.4 0 0.4
3 0.4 × 2 = 0.8 0 0.8
4 0.8 × 2 = 1.6 1 0.6
5 0.6 × 2 = 1.2 1 0.2
6 0.2 × 2 = 0.4 0 0.4
7 0.4 × 2 = 0.8 0 0.8
8 0.8 × 2 = 1.6 1 0.6
16 0.8 × 2 = 1.6 1 0.6

このように、16回繰り返すと得られるビット列は:

0,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1

すなわち

0.0001100110011001₂

となります。


2. 無限循環のパターン

  • 0.1₁₀ は 2進では「0.0001 1001 1001 …」と “0011” の繰り返し
  • 小数点以下4ビット目以降、周期的に「1001」が現れます
  • 16ビットで切り取ると、ちょうど「0001 1001 1001 1001」→「0001100110011001₁₆bit」

3. 選択肢との照合

選択肢 ビット列 説明
① 0.0000011001100110₂ 0000011001100110 最初の3ビットが多すぎ
② 0.0000110011001100₂ 0000110011001100 4ビット目以降ずらしすぎ
③ 0.0001100110011001₂ ← 正解 0001100110011001 上記の手順で得られた16ビット
④ 0.0011001100110011₂ 0011001100110011 3ビット分ずれている
⑤ 0.0110011001100110₂ 0110011001100110 2ビット分ずれている

結論

②や④・⑤は「周期ビット」をずらしてしまっているため不正解。手順通りに初回から16ビット目まで取ると③「0.0001100110011001₂」が最も適切です。

なぜこのような計算をするのですか?

 

この「小数部を2倍して整数部を取り出す」計算は、10進の小数(例えば0.1)を2進で表すための標準的なアルゴリズムだからです。理由を整理すると以下のとおりです。


1. コンピュータは「2進」で数を扱う

  • CPUやメモリはビット(0/1)の組み合わせで数値を表現するため、すべての実数をまず2進数に変換する必要があります。

2. なぜ「×2→整数部を取り出す」のか

  1. 2進では、小数第1位は 2⁻¹ (0.5)、第2位は 2⁻² (0.25)、…という重みを持ちます。
  2. 0.1₁₀ を2進で書くには、これらの重みの和で表現できるか調べる必要があります。
  3. 「残りの小数部×2」を繰り返すと、
    • 整数部(0か1)が順に2進の各ビットに対応
    • 残余を次の桁の重みに回す
      という仕組みで、一桁ずつビットを抽出できるのです。

3. これを知らないと何が困るか?

  • 0.1₁₀ のように2進では循環小数になる数は、有限ビットに切り捨てると「丸め誤差」が生じます。
  • この誤差が累積して、「0.01 を100回足しても1.0 にならない」という現象を引き起こします。
  • そのメカニズムを理解・予測するには、実際に2進表現を求めて誤差の大きさを見積もる必要があります。

まとめ

  • 目的:10進小数をビット列(2進小数)に正確に変換するため
  • 方法:残りの小数部を2倍し、その整数部を次のビットとして取り出す操作を繰り返す
  • 意義:コンピュータ内部での数値表現と丸め誤差の発生源を明らかにする

この手順を通じて「なぜ誤差が生じるのか」「どのくらいの桁まで正確か」が定量的に分かるため、数値計算の信頼性を確保するうえで欠かせない計算です。

-10~10を2進数で表してください

コンピュータでは負の整数を扱うときに「二の補数(two’s complement)表現」をよく使います。今回、–10~+10 を表すには、符号付き5ビット(二の補数)を使うと、–16~+15 の範囲をカバーできるので十分です。

以下に、5ビット二の補数表現で –10~+10 をまとめます。

10進数 5ビット二の補数表現
–10 10110
–9 10111
–8 11000
–7 11001
–6 11010
–5 11011
–4 11100
–3 11101
–2 11110
–1 11111
0 00000
1 00001
2 00010
3 00011
4 00100
5 00101
6 00110
7 00111
8 01000
9 01001
10 01010

二の補数表現のポイント

  1. 正の数は通常の2進表現をそのまま符号拡張(先頭を0で埋める)
  2. 負の数は、
    1. 対応する正数のビット列(ここでは+10 → 01010)をビット反転(10101)
    2. さらに「+1」する(10101 → 10110)
      という手順で得られます。

このようにして得られる5ビット列を使うと、–10~+10 を一貫して扱うことができます。