情報系科目では基礎の基礎である、基数変換についてまとめてみました。
10進数
言うまでもなく、10進数の下から数えて1桁目は、0~9に対応しています。同様に2桁目は10~90。3桁目は100~900。
たとえば、128という数字を分解してみると、100が1つ、10が2つ、1が8つと表現できます。次のとおりです。
128
= (1 x 102)
+ (2 x 101)
+ (8 x 100)
これがまず前提となります。
10進数への変換
2進数
数値を0と1の2種類の数字であらわしたのが2進数です。10進数との対応は、以下のような表になります。
10進数 | 2進数 |
---|---|
0 | 0 |
1 | 1 |
2 | 10 |
3 | 11 |
4 | 100 |
5 | 101 |
6 | 110 |
7 | 111 |
10進数は、1桁で10個(0~9)の数値を表せるのに対し、2進数では1桁で2つの数値しか表せません。
つまり、1つの桁が2で繰り上がってしまうことを意味します。
次の例を考えてみます。
(1101)2
10進数の例では、各桁に10の(桁数-1)乗を掛けていました。2進数の場合は、これが2の(桁数-1)乗になります。
式に当てはめて計算してみます。
(1101)2
= (1 x 23)
+ (1 x 22)
+ (0 x 21)
+ (1 x 20)
= 8
+ 4
+ 0
+ 1
= 13
このように、基数に桁-1を乗じ、それらを足し合わせれば、10進数への変換が容易にできます。
16進数
では、10進数よりも大きい数の場合はどうでしょうか。
同じように計算してみましょう。
次の例を考えてみます。
2AC
英字を数字に直します。
(2) (10) (12)
式に当てはめて計算します。
(2)(10)(12)
= (2) x 162
+ (10) x 161
+ (12) x 160
= 512
+ 160
+ 12
= 684
同様に変換できました。
10進数からの変換
2進数
先ほど計算した10進数13を2進数に変換する方法を考えてみます。
今度は、先ほどとは逆に数字が0になるまで割っていき、あまりを逆順に並べます。
次のように考えます。
13
= 13 / 2 = 6…1
6 / 2 = 3…0
3 / 2 = 1…1
1 / 2 = 0…1
= 1101
16進数
同様です。
684
= 684 / 16 = 42…12
42 / 16 = 2…10
2 / 16 = 0… 2
= (2) (10) (12)
= 2AC
他も同様に計算できますね。
これで、n進数のすべてのパターンに対して対応できるようになりました。
たとえば、2進数から12進数への変換などは、
2進数⇒10進数⇒12進数
というプロセスを踏めば良いわけです。
分かってみるととても簡単ですね。
2進数からの変換
2の乗数であれば、もう少し簡単になります。
16進数
16進数は、16で桁が繰り上がるわけですが、これは2進数の4桁に対応していますね。
次の例を考えます。
(1100110110)2
= (11) (0011) (0110)
各桁を計算します。
11
= 1 x 21
+ 1 x 20
= 3
0011
= 1 x 21
+ 1 x 20
= 3
0110
= 1 x 22
+ 1 x 21
+ 0 x 20
= 6
= (336)16
4進数
(1100110110)2
= (11) (00) (11) (01) (10)
= 3 0 3 1 2
= (30312)4
8進数
(1100110110)2
= (1) (100) (110) (110)
= 1 4 6 6
= (1466)8
32進数
(1100110110)2
= (11001) (10110)
= 25 22
= ((25)(22))32
2進数への変換
2進数からの変換と同様に、各桁に分けてから計算します。
n進数に応じた桁に揃えるため、各桁の左に0を追加します。
例:
8進数の場合
8 = 23 のため、3桁に揃えます。
16進数の場合
16 = 24 のため、4桁に揃えます。
16進数
2AC
= (2) (10) (12)
2
= 2 / 2 = 1…0
1 / 2 = 0…1
= 0010
10
= 10 / 2 = 5…0
5 / 2 = 2…1
2 / 2 = 1…0
1 / 2 = 0…1
= 1010
12
= 12 / 2 = 6…0
6 / 2 = 3…0
3 / 2 = 1…1
1 / 2 = 0…1
= 1100
= 1010101100
8進数
1254
1
= 1 / 2 = 0…1
= 001
2
2 / 2 = 1…0
1 / 2 = 0…1
= 010
5
5 / 2 = 2…1
2 / 2 = 1…0
1 / 2 = 0…1
= 101
4
4 / 2 = 2…0
2 / 2 = 1…0
1 / 2 = 0…1
= 100
= 1010101100
小数
1桁目が0で、左に行くつれて重みが増えて行くことがわかりました。
同じように、小数点がある場合は、右に行くにつれて重みが減っていきます。
2進数 -> 10進数
次の例を考えてみます。
(10111001.1011)2
10111001
= 1 x 27
+ 0 x 26
+ 1 x 25
+ 1 x 24
+ 1 x 23
+ 0 x 22
+ 0 x 21
+ 1 x 20
= 185
.1001
= 1 x 2-1 = 0.5
+ 0 x 2-2 = 0
+ 1 x 2-3 = 0.125
+ 1 x 2-4 = 0.0625
= 0.6875
= 185.6875
10進数 -> 2進数
185
185 / 2 = 92…1
92 / 2 = 46…0
46 / 2 = 23…0
23 / 2 = 11…1
11 / 2 = 5…1
5 / 2 = 2…1
2 / 2 = 1…0
1 / 2 = 0…1
= 10111001
.6875
0.6875 * 2 = 1.375
0.3750 * 2 = 0.750
0.7500 * 2 = 1.500
0.5000 * 2 = 1.000
= 1011
10111001.1011
整数部では逆順に並べたのに対し、小数部では正順であることに注意してください。
最後に
基数変換は基礎中の基礎ですので、必ずと言って良いほど問題に出てきます。
ただ、残念ながら実務では忘れてしまっても支障ない程に役に立ちません。
割り切って覚えてしまうのがいいかもしれませんね。