簡単に言えば、「どのくらい増えると桁上がりが発生するか」ということ。10進数であれば10になると一桁上がり、2進数であれば、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進数からの基数変換はすべてできるようになった。ひとまず、今回の件はこれだけで解決だけれども、どうせ後で別の問題やらされるのは目に見えているので、もうちょっと突っ込んだ内容を。
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進数 |
0 | 00 | 0x0 |
1 | 01 | 0x1 |
10 | 02 | 0x2 |
11 | 03 | 0x3 |
100 | 04 | 0x4 |
101 | 05 | 0x5 |
110 | 06 | 0x6 |
111 | 07 | 0x7 |
1000 | 010 | 0x8 |
1001 | 011 | 0x9 |
1010 | 012 | 0xA |
1011 | 013 | 0xB |
1100 | 014 | 0xC |
1101 | 015 | 0xD |
1110 | 016 | 0xE |
1111 | 017 | 0xF |
あとは、8進数なら3桁ずつ区切って2進数から変換する。16進数なら4桁ずつ区切って2進数から変換すればよい。逆に変換する場合は深く考えずに8進数を3桁の2進数にして並べてやればいいし、16進数を4桁の2進数にして並べてやれば変換できる。
計算の数が増えるが、10進数からの変換を一度2進数に変換してからやってもよい。俺としては、こっちのほうが楽だから好きだけれど。
これが一番厄介なのかもしれないが、やはりこれも難しくはない。各桁がどれほどの数字の大きさなのかがわかれば、それをすべて足せば10進数に変換できる。
2進数の場合、一桁目から1・2・4・8・16……と10進数に対応している。これらを2進数の各桁の数字と掛けてからすべて足してやると10進数に変換できる。例えば二進数(11001010)の場合は……
こんな感じで計算してやるとよい。他の進数でも同じような感じにできる。その場合は……
ちょっと複雑になるけど数式にするとこういう感じになる。これで、全ての基数変換が可能となる。特に頻繁に用いられる2進数と8進数と16進数は確実にできるようになるべきである。パソコン上では2進数と16進数はよく使うため、いつか役に立つことが来るはずである。
特に組み込み系のプログラムをやる人は、これができないと話にならないので、絶対に習得するように。その場合、2進数と16進数の対応は暗記してしまうべきである。
最後に、おまけになるが10進数から10進数への変換をして、なぜこれらの方法で基数変換ができるのかをまとめておこう。
10進数からn進数への変換は、10進数同士に当てはめてもきちんと成立する。ここから見えてくる内容もあると思うので、簡単に説明します。529を変換します。
これを下から順に並べていくと、529となる。n進数への変換ができるのは、このような数字の性質のためである。
小数部の変換についても10進数で説明すると……0.362の場合……
今度は、逆に10で掛けて小数部を繰り返せばよい。そして、最後は整数部を上から並べれば0.362となる。つまり、nで掛けて小数部において繰り返し、整数部を上から並べれば変換ができるわけである。
これがわかれば基数変換に関しては怖いものなしのはず。とりあえず、基数変換に関する全てはこのページにまとめてあるので、忘れたときにでも見て思い出すといい。