10進法の掛け算

10進数を2進数に変換する方法.2進法の掛け算.2進数を10進数に変換する方法.と準備が整ったので,それらを組み合わせて10進法の掛け算を作ってみましょう.これはなかなか大作です.前回の10進数を2進数に変換する方法も効率の良い方法に変わりました.

プログラムはここです.

順に追って行きましょう.
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-01-23-13-26
最初の配置はこのようになっています.

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-01-23-01-20
?はこのように赤い数(10進数用)と緑の横棒に置き換わります.

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-01-23-15-55

緑の横棒は
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-01-23-04-32%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-01-23-04-45
のような赤い丸に置き換わります.これは2進法のように見えますが,10進法の各桁ごとで独立した2進数表現なことが特徴です.2進化10進数といいます.

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-01-23-16-14
2進化10進表現を使うと,10進法の位ごとに独立して変換できるので,前の記事の10進2進変換よりも格段に効率よくうごきます.

これから2進数に変換します.
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-01-23-05-00
1の位は1,2,4,8の2進数になります.
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-01-23-05-30
10の位は,10,20,40,80の2進数になります(普通の2進数なら,16,32,64となるところが違います)

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-01-23-05-43
同様に100,200,400,800
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-01-23-05-59
1000,2000,4000,8000です.

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-01-23-16-30
いっぺんにそれらの2進数が重なりました.

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-01-23-06-15
これは例の2進法のたし算のプログラムによって,最終的に数が重なって置かれていない表現に変わり,
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-01-23-16-53
のようになりました.検算してみると,左の数は,64+8+1で73に,右の数は64+4+2で70になるので,あってます.

次にマル1のボタンを押すと,数字の上に青い横棒が重ねられます.これが次の計算へのトリガーになります.

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-01-23-08-05
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-01-23-17-20
青い横棒は1と重なった時だけ,斜め矢印を生成します.それ以外は消えます.
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-01-23-17-39
斜め矢印は
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-01-23-17-55
斜めに進みながら,青いボールを置いて行きます.斜めに一つずれるということは,2進法で考えると2倍するということになります.つまり,この青いボールの横の並びは,下から,最初の数字73の2倍,4倍,8倍...を表現していることになります.

次に,マル2のボタンを押すと,2進数の上に赤い横棒が生成されます.
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-01-23-09-27
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-01-23-18-39
この赤い横棒は,1のときだけ上向きの赤矢印を生成します.
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-01-23-19-00
この矢印は,上に進み,斜めの壁にぶつかると横に方向転換します.
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-01-23-19-26

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-01-23-09-10
横矢印は横に進みます.
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-01-23-19-42%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-01-23-20-25
青いボールにぶつかると,上に進む矢印と横に進む矢印に分岐します.そのまま赤矢印が上に進み,黒い棒にぶつかると,2進数の1を縦に2つ生成します.
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-01-23-20-54%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-01-23-21-34

上の列に生成された1は,そのまま2進10進変換に使われて消えます.
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-01-23-06-54 %e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-01-23-07-02

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-01-23-07-17 %e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-01-23-07-48
緑の変換機や8桁目の記号からどれくらい離れた位置にある1なのかによって,生成される10進数は変わります.それぞれ1,2,4,8,....,65536までの数を生成しています.

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-01-23-21-52%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-01-23-22-22
ここで注意して欲しいのは,下から上がってくる矢印による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進法での計算をしてしまっても,答えは変わらないというところが面白い点です.

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-01-23-06-28 %e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-01-23-06-39
このような10進法のたし算にメガネが55個必要です.

最終的に
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-01-23-22-49
のような結果になりました.

メガネは全部で120個になりました.本当にライブラリーが必要ですね.

2進化10進表記とか,シフトして足すとか,ハードウェアで作った電卓の中身に近い感じがします.プログラミングの例題で10進数を2進数への変換というのがありますが,たいていは2で割って引くという手続き的な計算です.この一連の2進法のプログラムを作ってて感じるのは,ビスケットはよりハードウェアに近い考え方の言語なんだ,ということです.とても不思議な感じがします.

シェアする

  • このエントリーをはてなブックマークに追加

フォローする