10進数を2進数に変換する方法.2進法の掛け算.2進数を10進数に変換する方法.と準備が整ったので,それらを組み合わせて10進法の掛け算を作ってみましょう.これはなかなか大作です.前回の10進数を2進数に変換する方法も効率の良い方法に変わりました.
プログラムはここです.
順に追って行きましょう.
最初の配置はこのようになっています.
?はこのように赤い数(10進数用)と緑の横棒に置き換わります.
緑の横棒は
のような赤い丸に置き換わります.これは2進法のように見えますが,10進法の各桁ごとで独立した2進数表現なことが特徴です.2進化10進数といいます.
2進化10進表現を使うと,10進法の位ごとに独立して変換できるので,前の記事の10進2進変換よりも格段に効率よくうごきます.
これから2進数に変換します.
1の位は1,2,4,8の2進数になります.
10の位は,10,20,40,80の2進数になります(普通の2進数なら,16,32,64となるところが違います)
同様に100,200,400,800
1000,2000,4000,8000です.
いっぺんにそれらの2進数が重なりました.
これは例の2進法のたし算のプログラムによって,最終的に数が重なって置かれていない表現に変わり,
のようになりました.検算してみると,左の数は,64+8+1で73に,右の数は64+4+2で70になるので,あってます.
次にマル1のボタンを押すと,数字の上に青い横棒が重ねられます.これが次の計算へのトリガーになります.
青い横棒は1と重なった時だけ,斜め矢印を生成します.それ以外は消えます.
斜め矢印は
斜めに進みながら,青いボールを置いて行きます.斜めに一つずれるということは,2進法で考えると2倍するということになります.つまり,この青いボールの横の並びは,下から,最初の数字73の2倍,4倍,8倍...を表現していることになります.
次に,マル2のボタンを押すと,2進数の上に赤い横棒が生成されます.
この赤い横棒は,1のときだけ上向きの赤矢印を生成します.
この矢印は,上に進み,斜めの壁にぶつかると横に方向転換します.
横矢印は横に進みます.
青いボールにぶつかると,上に進む矢印と横に進む矢印に分岐します.そのまま赤矢印が上に進み,黒い棒にぶつかると,2進数の1を縦に2つ生成します.
上の列に生成された1は,そのまま2進10進変換に使われて消えます.
緑の変換機や8桁目の記号からどれくらい離れた位置にある1なのかによって,生成される10進数は変わります.それぞれ1,2,4,8,....,65536までの数を生成しています.
ここで注意して欲しいのは,下から上がってくる矢印による2進法での計算と,それから10進数への変換は同時に行われているという点です.2進数上で桁上がりがまだ不完全な状態でもどんどん10進数への変換をして,10進数上での加算に任せてしまっています.
たとえば,2進の6桁目に1があったので,それを消して10進の32を生成しました.その後また2進の6桁目に1がきたため,またそれを消して10進の32を生成しました.その結果10進法上で32+32を行って,64になりました.これが同時に実行した場合です.それに対して,2進数の桁上がりが完全に終了するまで待つと,6桁目に1が二つくるので,それは桁上がりして7桁目に1ができます.それはそのまま64に変換されます.計算上は2進法で計算した法が楽だし高速ですが,それを待ってからやらずに先走って10進法での計算をしてしまっても,答えは変わらないというところが面白い点です.
このような10進法のたし算にメガネが55個必要です.
最終的に
のような結果になりました.
メガネは全部で120個になりました.本当にライブラリーが必要ですね.
2進化10進表記とか,シフトして足すとか,ハードウェアで作った電卓の中身に近い感じがします.プログラミングの例題で10進数を2進数への変換というのがありますが,たいていは2で割って引くという手続き的な計算です.この一連の2進法のプログラムを作ってて感じるのは,ビスケットはよりハードウェアに近い考え方の言語なんだ,ということです.とても不思議な感じがします.