
前回取り上げた、「11011(2進数)=27(10進数)」の例で考えます。基本になる計算式は以下のものでした。

この式の真ん中の部分を取り出して、共通する2の累乗で順々に括っていって次のように変形します(外側から2で括っていっても同じです)

そのうえで、この式を元の式に戻してじっと見つめます。

まず、これを左側からみていきます((a)の方向)。2進表記の左側の桁の数から2を掛けてそれに右隣の値を足し、それにまた2を掛けて隣を足す、という計算をしていくと、右はしの10進表記の値ができあがる、という手順になっていることが確認できると思います。
次に、同じものを今度は右側からみてみます((b)の方向)。元の10進数を2で割りながら、はじき出した余りを下の位からセットしていくと、左の2進数ができあがる、という格好になっていることがわかるでしょうか?
ここから、最初にあげた10進/2進の変換手順は、2進数の位取りの大もとの式を変形したところから導かれる、また、双方の手順は、同じフローをそれぞれ反対方向から眺めたものである、ということが理解できます。これを別の仕方で図に書くと、以下のようになります。

この図のそれぞれの箇所に数字を埋めていくと(下図の赤字の部分)、任意の数について2進法と10進法の変換ができることになります。これは、2進法の解説でよく出てくる割り算の遷移式を図解したものです。また、この「2」の部分を別の数に入れ替えれば、2進法以外のn進法についても適用することができます。その場合は、余りとして下に落ちる数は、「n-1」の範囲で値が動けることになります。もちろん10進法自身についてもこのことは成り立ちます。

この算法は、位取りの定義式を変形して導いた変則的なやり方のようにも見えますが、われわれはふだん10進数の時でも両方の考え方の間をけっこう自由に行き来しています。たとえば英語でいうと、「1500」という数があったときに、それを「1×10^3+5×10^2 (one thousand and five hundred)」と言ったり、「(1×10+5)×10^2 (fifteen hundred)」と言ったり、という例などがそうです。
参考までに、表計算ソフトにこのロジックを入れて「2進数生成マシン」というのを作ってみました。10進数の元の数を関数計算にかけて2進数の各桁を中央の行に生成し、それをもう一度10進数に変換して元に戻ることを確認しています。この中で、INT関数は、割り算から整数の商を取り出す関数、MOD関数は、割り算の余りを取り出す関数になります。簡単にできますので、興味のある方はご自分でもやってみてください。
