10進数を2進数に変換する方法に関して。
意味だけをざっと解説しておく。この説明はデジタル回路の冒頭と重複するが気にしない。10進法というのは、我々人間が使っている数字のことだ。0,1,2,3,4,5,6,7,8,9と数値が上がって、次は10で桁上げする。ようは、1桁につき0〜9の10パターンの表記方法があるから10進法。ちなみに10進法は人間の指の本数に由来している。高度な知能を持ったのがイカなら12進数になったかもしれない。
2進法というのは定義から言えば1桁につき2パターンの表記方法がある。0と1。0,1ときたら次は桁上がりして10になるといった感じだ。
デジタル回路を見てもらえば10進数と2進数の対応表があるが、あんな対応表で直していては時間の無駄。一定の計算で10進数の2進数に直す方法はあるのか?という問題。実は割り算でできる。
例えば10進法で表記した数値、1234があるとする。これは次のように表せる。
1×103+2×102+3×101+4×100
愚問かもしれないが、1234から1と2と3と4を取り出すにはどのような操作をしたらいいか考えよう。単純に1桁目を見る2桁目を見るのではなく、計算で導く方法だ。答えは単純に、1234を10で割った余りを求めればいい。
何故10で割ったかというと、1234という10進法の数字の各桁の数字を取り出すためだ。2進法に直したければ、これを2で割っていく。
これより、1234は2進法では10011010010となることがわかる。このようにして10進数を2進数に変換する。
逆に2進数を10進数に直す場合は、最初のほうに書いた「1×103+2×102+3×101+4×100」を2進数でやる。
1×210+0×29+0×28+1×27+1×26+0×25+1×24+0×23+0×22+1×21+0×20 = 1024+0+0+128+64+0+16+0+0+2+0 = 1234
先に書いた方法で2進数に変換できるが、たかが1234を変換するのに11回も割り算をしなければならないとなるとかなり面倒だ。
例えば、1234は10進法で1×103+2×102+3×101+4×100と表せると書いたが、1234を100進数に表すとどうなるか?100進法では、10進法の0〜99までは桁上がりしない。100個の記号を書くのは面倒なので、例えば100進法の50は(50)と表記することにする。
1234 = (12)×1001+(24)×1000
10進法の2桁が1桁で表されることがわかる。これを2進法に適用しようという考えだ。例えば、1234を4進法で表す。
1 0 3 1 0 2
103102は、各桁が2進法の2桁に相当するはずだ。4進法の0は2進法の0、4進法の1は2進法の1、4進法の2は2進法の10、4進法の3は2進法の11。よって、
103102 = 01 00 11 01 00 10 = 10011010010
と、2進法に変換できる。これなら一度4進法と2進法の対応表を作ってしまえば割り算の回数は6回で済み、こちらのほうが効率がいい。また、4進法よりも8進法、16進法、32進法を使ったほうが、当然速い。
プログラム言語で変換するときは、その言語が扱える最大の2の乗数を用いるのが最速になる。