10進数での「10分の1」を2進表現したものとして最も適切なものはどれか。ただし、以下の2進表現では、小数点以下16位までを示している。
0.0000011001100110 0.0000110011001100 0.0001100110011001 0.0011001100110011 0.0110011001100110
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
- 小数部(初めは0.1)に2をかける
- 結果の整数部(0か1)が、次のビット
- 残りの小数部をまた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→整数部を取り出す」のか
- 2進では、小数第1位は 2⁻¹ (0.5)、第2位は 2⁻² (0.25)、…という重みを持ちます。
- 0.1₁₀ を2進で書くには、これらの重みの和で表現できるか調べる必要があります。
- 「残りの小数部×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 |
二の補数表現のポイント
- 正の数は通常の2進表現をそのまま符号拡張(先頭を0で埋める)
- 負の数は、
- 対応する正数のビット列(ここでは+10 → 01010)をビット反転(10101)
- さらに「+1」する(10101 → 10110)
という手順で得られます。
このようにして得られる5ビット列を使うと、–10~+10 を一貫して扱うことができます。