2進数・10進数・16進数を相互変換(基数変換)する方法についてまとめます。
2進数から10進数への変換
以下の表の「2進数の桁が繰り上がるとき」に注目してください。
10進数 | 2進数 |
---|---|
0 | 0 |
1 | 1 |
2 | 10 |
3 | 11 |
4 | 100 |
5 | 101 |
6 | 110 |
7 | 111 |
8 | 1000 |
9 | 1001 |
10 | 1010 |
…… | …… |
2進数のそれぞれの桁が1になっている状態を表したのが以下の表です。
10進数 | 2進数 |
---|---|
1 | 00000001 |
2 | 00000010 |
4 | 00000100 |
8 | 00001000 |
16 | 00010000 |
32 | 00100000 |
64 | 01000000 |
128 | 10000000 |
表を見て分かる通り、2進数で「1」となっている桁に対応する10進数の値を合計することにより、2進数から10進数の値を求めることができます。
例えば、2進数の「10101010」を10進数に変換する場合、値が128、32、8、2のところでビットが1なので、2進数の「10101010」は10進数では「170」ということです。
10進数から2進数への変換
2進数から10進数に変換した逆を行います。つまり、2進数の各桁に10進数の数値を割り当てていきます。
例えば、10進数の「28」を2進数に変換するには、28に一番近い2進数の桁はどれか?を考えます。
これを考えて、2進数のビットを立てると、以下のようになります。
00010000
これは2進数の16です。まだ28には足りないので、1個下のビットを立ててみます。
00011000
これは24です。まだ足りないので、同じようにもう1個下のビットを立ててみます。
00011100
これで28になりました。
これは以下のように、下の桁から確定させていくこともできます。導き出せる結果は全く同じです。
10進数の数値を「 0 」になるまで「 2 」で割り算していき、その結果の「余りの数」を並べることにより、10進数の値を2進数の値へ変換することができます。
例えば、10進数の「28」を2進数に変換すると、以下のようになります。
- 28 / 2 = 14, 余り0
- 14 / 2 = 7, 余り0
- 7 / 2 = 3, 余り1
- 3 / 2 = 1, 余り1
- 1 / 2 = 0, 余り1
足りないビット分は上位のビットから「0」で埋めるので、「00011100」となります。
16進数から10進数への変換
以下の表に従って変換を行います。
$16^{4}$ | $16^{3}$ | $16^{2}$ | $16^{1}$ | $16^{0}$ |
---|---|---|---|---|
65536 | 4096 | 256 | 16 | 1 |
例えば、16進数 020AF であれば、2 * 4096 + 10 * 16 + 1 * 15 = 8367
と求めることができます。
10進数から16進数への変換
16進数から10進数に変換した逆を行います。つまり、16進数の各桁に10進数の数値を割り当てていきます。
例えば、10進数の 8367 を16進数に変換するには、8367に一番近づくことができる16進数の桁はどれか?を考えます。
まず、4桁目を2にすると、4096 * 2 = 8192
になります。
続いて、2桁目をAにすると、10 * 16 = 160
になり、8192 + 160 = 8352
となります。
最後に、1桁目をFにすると、15 * 1 = 15
になり、8352 + 15 = 8367
になります。
これは以下のように、下の桁から確定させていくこともできます。導き出せる結果は全く同じです。
10進数の数値を「 0 」になるまで「 16 」で割り算していき、その結果の「余りの数」を並べることにより、10進数の値を16進数の値へ変換することができます。
例えば、10進数の「8367」を16進数に変換すると、以下のようになります。
- 8367 / 16 = 522, 余り15(F)
- 522 / 16 = 32, 余り10(A)
- 32 / 16 = 2, 余り0
- 2 / 16 = 0, 余り2
足りない桁は上位の桁から「0」で埋めるので、「020AF」となります。
2進数から16進数への変換
2進数の数値を16進数の数値に変換するためには、以下の3つのステップを踏みます。
- 2進数(8ビット)を4桁(4ビット)ずつに分解する
- 分解した数から10進数に変換する
- 10進数の値を16進数に変換し、結合する
なぜ4桁ずつに分解するのかというと、5ビット目が$2^{5} = 16$だからです。
つまり、5~8ビット目は必ず16以上になり、1~4ビット目は必ず15以下になります。
以下では、例として、2進数「00101010」を16進数に変換する場合を考えてみましょう。
- 2進数を4桁ずつに分解する
2進数「00101010」を「0010」と「1010」に分解します。 - 分解した数から10進数の値を求める
2進数「0010」は10進数「2」、2進数「1010」は10進数「10」です。 - 10進数の値を16進数に変換し、結合する
10進数「2」は16進数「2」、10進数「10」は16進数「A」です。
よって、2進数「00101010」は16進数「2A」になります。
16進数から2進数への変換
16進数の数値を2進数の数値に変換するためには、2進数から16進数に変換した時と逆のことをします。
これには以下の3つのステップを踏みます。
- 16進数を1桁ずつに分解する
- 分解した値から10進数に変換する
- 10進数の値を2進数に変換し、結合する
以下では、例として、16進数「2A」を2進数に変換する場合を考えてみる。
-
16進数を1桁ずつに分解する
16進数「2A」を「2」と「A」に分解します。 -
分解した値から10進数に変換する
16進数「2」は10進数「2」、16進数「A」は10進数「10」です。 -
10進数の値を2進数に変換し、結合する
10進数「2」は2進数「0010」、10進数「10」は2進数「1010」です。
よって、16進数「2A」は2進数「00101010」となります。
2進数の小数を変換する
以下の表は2進数の小数を扱う場合の10進数との対応関係です。
2進数
$2^{0}$ | $2^{-1}$ | $2^{-2}$ | $2^{-3}$ | $2^{-4}$ | $2^{-5}$ |
---|---|---|---|---|---|
1 | $\frac{1}{2}$ | $\frac{1}{4}$ | $\frac{1}{8}$ | $\frac{1}{16}$ | $\frac{1}{32}$ |
1 | 0.5 | 0.25 | 0.125 | 0.0625 | 0.03125 |
例えば、10進数の演算式7÷32の結果を2進数で表したいときは、0.00111
になります。
これは$\frac{1}{8} + \frac{1}{16} + \frac{1}{32}$を約分すると$\frac{4}{32} + \frac{2}{32} + \frac{1}{32}$なので、$\frac{7}{32}$になります。
16進数の小数を変換する
以下の表は16進数の小数を扱う場合の10進数との対応関係です。
16進数(10進数の小数は大変なので割愛)
$16^{0}$ | $16^{-1}$ | $16^{-2}$ | $16^{-3}$ | $16^{-4}$ |
---|---|---|---|---|
1 | $\frac{1}{16}$ | $\frac{1}{256}$ | $\frac{1}{4096}$ | $\frac{1}{65536}$ |
1 | 0.0625 | ... | ... | ... |
例えば、16進数の小数0.248を10進数の分数で表したいときは、$\frac{73}{512}$になります。
これは$\frac{2}{16} + \frac{4}{256} + \frac{8}{4096}$を約分すると$\frac{1}{8} + \frac{1}{64} + \frac{1}{512} = \frac{64}{512} + \frac{8}{512} + \frac{1}{512}$なので、$\frac{73}{512}$になります。
参考
ネットワークの勉強をはじめから – 2進数と10進数の変換方法
Schooの動画教材 基本情報技術者試験 第1回:計算問題