基数変換まとめ

情報系科目では基礎の基礎である、基数変換についてまとめてみました。

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

整数部では逆順に並べたのに対し、小数部では正順であることに注意してください。

最後に

基数変換は基礎中の基礎ですので、必ずと言って良いほど問題に出てきます。
ただ、残念ながら実務では忘れてしまっても支障ない程に役に立ちません。

割り切って覚えてしまうのがいいかもしれませんね。