基数とは

簡単に言えば、「どのくらい増えると桁上がりが発生するか」ということ。10進数であれば10になると一桁上がり、2進数であれば、2になると桁が上がる。

とりあえず、これだけわかっていれば大丈夫だとは思う。次に基数変換の具体的な方法。

基数変換(10進数から2進数)

これができないと他の基数変換もできないので、重点的に。

最も簡単な方法としては、10進の数を1か0になるまで順々に2で割っていく方法。100を2進数に変換する場合は……

このようにして、下のほうから順に数字を並べると(1100100)という2進数が出来上がる。この2進数を10進数にすると100になるので、Windowsの電卓などで確認してみよう。

なぜこのようになるかは、後で説明するとして、これはすべての基数変換の基本となる。今回は2進数だから2で割っていったが、8進数の場合は8で割って8未満になるまで繰り返し、16進数の場合は16で割って16未満になるまで繰り返す。つまり、n進数の場合はnで割ってn未満になるまで繰り返していくということである。

これだけで2進数だけではなく、10進数からの基数変換はすべてできるようになった。ひとまず、今回の件はこれだけで解決だけれども、どうせ後で別の問題やらされるのは目に見えているので、もうちょっと突っ込んだ内容を。

基数変換(2進数から8進数・16進数とその逆)

10進数からの基数変換は問題なくできると思うが、2進数から他の進数へ変換するのは、多少方法が変わってくる。しかし、10進数からの変換に比べて今回扱う、8進数と16進数への変換の場合は、非常に楽である。

その理由としては、8進数も16進数も、2進数のキリのいい部分で桁上がりするからである。最初に説明した基数の仕組みを思い出せばわかると思うが、8は2進数の(1000)であり、16は2進数の(10000)である。

つまり、2進数の4桁目に繰り上がると8進数も繰り上がり、5桁目に繰り上がると16進数も繰り上がるわけだ。つまり、その繰り上がるまでの数字はそのまま8進数・16進数に適応できることになる。簡単な例をいくつか紹介。これ以降は8進数は先頭に0を記述して表し、16進数は先頭に0xを記述して表す。業界では基本なので覚えておくように。

これらは、2進数と対応する8進数と16進数の一桁を覚えてしまえば、すぐに変換できる。次に対応表を示す。

2進数と8進数・16進数の対応表
2進数8進数16進数
2進数8進数16進数
0000x0
1010x1
10020x2
11030x3
100040x4
101050x5
110060x6
111070x7
10000100x8
10010110x9
10100120xA
10110130xB
11000140xC
11010150xD
11100160xE
11110170xF

あとは、8進数なら3桁ずつ区切って2進数から変換する。16進数なら4桁ずつ区切って2進数から変換すればよい。逆に変換する場合は深く考えずに8進数を3桁の2進数にして並べてやればいいし、16進数を4桁の2進数にして並べてやれば変換できる。

計算の数が増えるが、10進数からの変換を一度2進数に変換してからやってもよい。俺としては、こっちのほうが楽だから好きだけれど。

基数変換(n進数から10進数)

これが一番厄介なのかもしれないが、やはりこれも難しくはない。各桁がどれほどの数字の大きさなのかがわかれば、それをすべて足せば10進数に変換できる。

2進数の場合、一桁目から1・2・4・8・16……と10進数に対応している。これらを2進数の各桁の数字と掛けてからすべて足してやると10進数に変換できる。例えば二進数(11001010)の場合は……

こんな感じで計算してやるとよい。他の進数でも同じような感じにできる。その場合は……

ちょっと複雑になるけど数式にするとこういう感じになる。これで、全ての基数変換が可能となる。特に頻繁に用いられる2進数と8進数と16進数は確実にできるようになるべきである。パソコン上では2進数と16進数はよく使うため、いつか役に立つことが来るはずである。

特に組み込み系のプログラムをやる人は、これができないと話にならないので、絶対に習得するように。その場合、2進数と16進数の対応は暗記してしまうべきである。

最後に、おまけになるが10進数から10進数への変換をして、なぜこれらの方法で基数変換ができるのかをまとめておこう。

おまけ(10進数から10進数への変換)

10進数からn進数への変換は、10進数同士に当てはめてもきちんと成立する。ここから見えてくる内容もあると思うので、簡単に説明します。529を変換します。

これを下から順に並べていくと、529となる。n進数への変換ができるのは、このような数字の性質のためである。

小数部の変換についても10進数で説明すると……0.362の場合……

今度は、逆に10で掛けて小数部を繰り返せばよい。そして、最後は整数部を上から並べれば0.362となる。つまり、nで掛けて小数部において繰り返し、整数部を上から並べれば変換ができるわけである。

これがわかれば基数変換に関しては怖いものなしのはず。とりあえず、基数変換に関する全てはこのページにまとめてあるので、忘れたときにでも見て思い出すといい。