基数変換のメモ

2進数・10進数・16進数を相互変換(基数変換)する方法についてまとめます。

2進数から10進数への変換

以下の表の「2進数の桁が繰り上がるとき」に注目してください。

10進数2進数
00
11
210
311
4100
5101
6110
7111
81000
91001
101010
…………

2進数のそれぞれの桁が1になっている状態を表したのが以下の表です。

10進数2進数
100000001
200000010
400000100
800001000
1600010000
3200100000
6401000000
12810000000

表を見て分かる通り、2進数で「1」となっている桁に対応する10進数の値を合計することにより、2進数から10進数の値を求めることができます。

例えば、2進数の「10101010」を10進数に変換する場合、値が128、32、8、2のところでビットが1なので、2進数の「10101010」は10進数では「170」ということです。

4294124c84a9b764dbd7239717433247

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つのステップを踏みます。

  1. 2進数(8ビット)を4桁(4ビット)ずつに分解する
  2. 分解した数から10進数に変換する
  3. 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つのステップを踏みます。

  1. 16進数を1桁ずつに分解する
  2. 分解した値から10進数に変換する
  3. 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回:計算問題