目次
はじめに
基本情報技術者試験の学習を進めていく中で、進数変換の整数部分は理解できたものの、小数部分の変換方法が曖昧なまま放置していました。特に2進数や16進数で小数を扱う場面に遭遇した際、正確な変換手順が分からず困ることがありました。今回は進数変換における小数部分の扱い方について、備忘録としてまとめます。
10進数から他の進数への変換
10進数の小数を他の進数に変換する際は、整数部分とは異なるアプローチが必要です。整数部分は割り算を使いますが、小数部分は掛け算を使います。
【10進数から2進数への変換】
10進数の小数部分を2進数に変換するには、小数部分に2を掛け続ける方法を使います。
【具体的な手順】
- 小数部分に2を掛ける
- 結果の整数部分(0または1)を記録する
- 結果の小数部分を取り出す
- 小数部分が0になるか、必要な桁数に達するまで手順1〜3を繰り返す
- 記録した整数部分を上から順に並べる
例として、10進数の0.625を2進数に変換してみます。
0.625 × 2 = 1.25 → 整数部分は1、小数部分は0.25
0.25 × 2 = 0.5 → 整数部分は0、小数部分は0.5
0.5 × 2 = 1.0 → 整数部分は1、小数部分は0(終了)
上から順に整数部分を読むと「101」となるので、0.625(10進数) = 0.101(2進数)です。
【10進数から8進数への変換】
10進数の小数部分を8進数に変換する手順は、2進数への変換と同じで、掛ける数が8になるだけです。
例として、10進数の0.625を8進数に変換してみます。
0.625 × 8 = 5.0 → 整数部分は5、小数部分は0(終了)
したがって、0.625(10進数) = 0.5(8進数)です。
【10進数から16進数への変換】
10進数の小数部分を16進数に変換する手順も同じで、掛ける数が16になります。整数部分が10以上の場合はA〜Fに変換します。
例として、10進数の0.625を16進数に変換してみます。
0.625 × 16 = 10.0 → 整数部分は10(Aに変換)、小数部分は0(終了)
したがって、0.625(10進数) = 0.A(16進数)です。
別の例として、0.3を16進数に変換してみます。
0.3 × 16 = 4.8 → 整数部分は4、小数部分は0.8
0.8 × 16 = 12.8 → 整数部分は12(Cに変換)、小数部分は0.8
0.8 × 16 = 12.8 → 以降、0.8が繰り返される
この場合、0.3(10進数) = 0.4CCC...(16進数)となり、Cが循環します。
2進数から他の進数への変換
8進数や16進数への変換は、グループ化(桁をまとめる方法)を使うと簡単です。
【2進数から8進数への変換】
2進数から8進数への変換は、小数点から右に向かって3桁ずつグループ化する方法が便利です。8は2の3乗(2³ = 8)なので、2進数の3桁が8進数の1桁に対応します。
【具体的な手順】
- 小数点の右側から3桁ずつグループに分ける
- 最後のグループが3桁に満たない場合は、右側に0を追加する
- 各グループを8進数の1桁に変換する
例として、2進数の0.101001を8進数に変換してみます。
0.101001(2進数)
↓ 3桁ずつグループ化
0.101 001
↓ 各グループを8進数に変換
5 1
したがって、0.101001(2進数) = 0.51(8進数)です。
【2進数から16進数への変換】
2進数から16進数への変換は、8進数への変換と同様にグループ化を使います。16は2の4乗(2⁴ = 16)なので、2進数の4桁が16進数の1桁に対応します。
【具体的な手順】
- 小数点の右側から4桁ずつグループに分ける
- 最後のグループが4桁に満たない場合は、右側に0を追加する
- 各グループを16進数の1桁に変換する
例として、2進数の0.10110100を16進数に変換してみます。
0.10110100(2進数)
↓ 4桁ずつグループ化
0.1011 0100
↓ 各グループを16進数に変換
B 4
したがって、0.10110100(2進数) = 0.B4(16進数)です。
【2進数から10進数への変換】
2進数の小数部分を10進数に変換するには、各桁を分母が 2n の分数に変換して合計する方法を使います。
小数第1位の分母は 21(つまり2)、小数第2位の分母は 22(つまり4)、小数第3位の分母は 23(つまり8)となります。
例として、2進数の0.101を10進数に変換してみます。
0.101(2進数)
= 1/2¹ + 0/2² + 1/2³
= 1/2 + 0/4 + 1/8
= 0.5 + 0 + 0.125
= 0.625
したがって、0.101(2進数) = 0.625(10進数)です。
別の例として、2進数の0.11を変換してみます。
0.11(2進数)
= 1/2¹ + 1/2²
= 1/2 + 1/4
= 0.5 + 0.25
= 0.75
したがって、0.11(2進数) = 0.75(10進数)です。
8進数から他の進数への変換
2進数への変換は展開(各桁を複数桁に分解する方法)を使い、10進数への変換は割り算を使います。
【8進数から2進数への変換】
8進数から2進数への変換は、各桁を3桁の2進数に展開する方法が便利です。8進数の1桁は2進数の3桁に対応します。
【具体的な手順】
- 8進数の各桁を3桁の2進数に変換する
- 変換した2進数を順に並べる
- 不要な先頭の0は省略できる
例として、8進数の0.51を2進数に変換してみます。
0.51(8進数)
↓ 各桁を3桁の2進数に展開
5 → 101
1 → 001
↓ 順に並べる
0.101001
したがって、0.51(8進数) = 0.101001(2進数)です。
【8進数から10進数への変換】
8進数の小数部分を10進数に変換するには、各桁を分母が 8n の分数に変換して合計します。
例として、8進数の0.5を10進数に変換してみます。
0.5(8進数)
= 5/8¹
= 5/8
= 0.625
したがって、0.5(8進数) = 0.625(10進数)です。
別の例として、8進数の0.51を変換してみます。
0.51(8進数)
= 5/8¹ + 1/8²
= 5/8 + 1/64
= 0.625 + 0.015625
= 0.640625
したがって、0.51(8進数) = 0.640625(10進数)です。
複雑な問題では2進数経由が便利
桁数が多い場合や計算が複雑な場合は、一度2進数に変換してから10進数に変換する方が簡単です。
例として、8進数の0.51を2進数経由で10進数に変換してみます。
0.51(8進数)
↓ まず2進数に変換
0.101001(2進数)
↓ 各桁を分母2のn乗の分数に変換
= 1/2¹ + 1/2³ + 1/2⁶
= 2⁵/64 + 2³/64 + 1/64
= 32/64 + 8/64 + 1/64
= 41/64
= 0.640625
この方法なら、8の累乗を計算する必要がなく、2の累乗だけで済みます。
また、選択肢が分数の場合は、すぐに解答を見つけることができます。
【8進数から16進数への変換】
8進数から16進数への直接的な変換方法を覚えるのは大変なので、2進数を経由する方法が便利です。2進数経由なら、覚えるべき変換パターンが少なくて済みます。
【具体的な手順】
- 8進数を2進数に変換する(各桁を3桁に展開)
- 2進数を16進数に変換する(4桁ずつグループ化)
例として、8進数の0.51を16進数に変換してみます。
0.51(8進数)
↓ 2進数に変換
0.101001(2進数)
↓ 4桁ずつグループ化(右端に0を追加)
0.1010 0100
↓ 16進数に変換
A 4
したがって、0.51(8進数) = 0.A4(16進数)です。
16進数から他の進数への変換
2進数への変換は展開を使い、8進数への変換は2進数を経由し、10進数への変換は割り算を使います。
【16進数から2進数への変換】
16進数から2進数への変換は、各桁を4桁の2進数に展開する方法が便利です。16進数の1桁は2進数の4桁に対応します。
【具体的な手順】
- 16進数の各桁を4桁の2進数に変換する
- 変換した2進数を順に並べる
- 不要な先頭の0は省略できる
例として、16進数の0.B4を2進数に変換してみます。
0.B4(16進数)
↓ 各桁を4桁の2進数に展開
B(11) → 1011
4 → 0100
↓ 順に並べる
0.10110100
したがって、0.B4(16進数) = 0.10110100(2進数)です。
【16進数から8進数への変換】
16進数から8進数への直接的な変換方法を覚えるのは大変なので、2進数を経由する方法が便利です。この方法なら、複雑な変換ルールを覚える必要がありません。
【具体的な手順】
- 16進数を2進数に変換する(各桁を4桁に展開)
- 2進数を8進数に変換する(3桁ずつグループ化)
例として、16進数の0.A4を8進数に変換してみます。
0.A4(16進数)
↓ 2進数に変換
0.10100100(2進数)
↓ 3桁ずつグループ化(右端に0を追加)
0.101 001 000
↓ 8進数に変換
5 1 0
したがって、0.A4(16進数) = 0.510(8進数)です。
【16進数から10進数への変換】
16進数の小数部分を10進数に変換するには、各桁を分母が 16n の分数に変換して合計します。
例として、16進数の0.Aを10進数に変換してみます。
0.A(16進数)
= 10/16¹
= 10/16
= 0.625
したがって、0.A(16進数) = 0.625(10進数)です。
別の例として、16進数の0.8を10進数に変換してみます。
0.8(16進数)
= 8/16¹
= 8/16
= 0.5
したがって、0.8(16進数) = 0.5(10進数)です。
まとめ
進数変換の小数部分では、10進数から他の進数への変換は「掛け算」を使い、他の進数から10進数への変換は各桁を分母が進数のn乗の分数に変換して合計します。8進数と16進数の間の変換は、2進数を経由すると覚えるべきルールが少なくて済むので便利です。