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
- 小数部(初めは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 を一貫して扱うことができます。