PHPで数学をしよう① ~10進数⇔2進数の変換~

プログラミングを学んで面白いと思ったもの、数学やアルゴリズムを通して学んだものを書きます。数学が苦手な人も頭の体操程度に読んでもらえたら嬉しいです。

10進数から2進数へ

はじめはn進数についてです。実を言うとphpにはすでにn進数に変換する関数があります(今回でいうとdecbin関数、bindec関数)。なのでこの関数を使えばテーマは終わりなのですが、それだとあまりにもさみしいので、プログラミングとアルゴリズムを学習する目的で1から作ろうと思います。(あと基本情報の勉強にもなるかも・・・)

結論から言うと10進数から2進数への変換方法は、10進数の数値を0になるまで2で割り算し、その結果の余りをの数を並べることで変換できます。具体的には下のような計算になります。

これを大まかに関数にするとこんな感じでしょうか。

いろいろ細かい条件はあると思いますが今回はA、Bを満たせばOKとします。
まず変数を決めます。引数の10進数をint $decとしてAの処理に組み込みます。
その際、配列$nisin[]のポインタとなる$posが必要になります。
$decが0になるまでは2で割り続けて余りを求めればよいので、Aは以下のようになります。

Bの処理は単純で、Aで作った$nisin[]を$posをずらしながら出力すれば終わりとなるので、
関数全体としては以下のようになります。

2進数から10進数へ

次に2進数から10進数です。こちらは配列を使わずに基数変換と呼ばれるものを考えます。
例えば10進数で423という数は、


423=4*10^2+2*10^1+3*10^0

のように、各桁に10^2、10^1、10^0の重みと呼ばれるものがあります。(この10を基数といいます)
10進数の各桁に10倍の重みがあるので、2進数の各桁にもそれぞれ2倍の重みがあります。
2進数の基数は2です。例えば、


1101=1*2^3+1*2^2+0*2^1+1*2^0


のようにすれば、2進数の1101は8+4+0+1=13(10進数)となります。
これをコードにすると以下のようになります。

小数のときや負の数を考慮していないので、全体として拙いプログラムになりましたが、
原理に戻ってプログラミングできたのが良かったです。
このことを噛みしめながら次からはdecbin関数とbindec関数を使おうと思います!(笑)