パ:1人間=1ビット
パ:1人間=1ビット 足し算 の続き。
前回の足し算の方法では100を足すのに一連の動作を100回くりかえさなければならなかった。今回はそれを改善。
Uint8 a= 01100010B; 2進法表記
Uint8 b= 00111010B;
a+=b;を行ってみる。
Aの値、Bの値それぞれをセット。Aの列を0110010B壁紙の横に移動して真似してもらう。Bの列も同様。
Aの列の左側にBの列を並べる。
「せーの」で、Bの列の右手上がってる人全員は横のAの列の人の頭をたたく。
たたかれたAの人は前々回記事のインクリメントの要領で、Aの前の人に情報を必要なら頭をたたくことにより伝えていく。そして全員の動きが
なくなったらおしまい。
数式で書くとこんなふうになる
Uint8 a= 01100010B;
Uint8 b= 00111010B;
Uint8 hit; たたかれなぁ~をあらわした変数。
hit=b; // Bの列の人はたたいても本人は変化しない
for(;;){
tmpa = a xor hit; // たたかれた分、本人が変化し
tmphit = (a and hit) <<1; // 必要なら前の人をたたく
a=tmpa;
hit=tmphit;
if(hit==0){
break;
}
}
といったものになる。tmp**という変数を使ったが、for文の中の4つの式は一気に行われるような感じ。
Aの列の人は手をたたきを含め上げ下げしたと同時に次のたたきを感じるのでテンポよく処理しなければならない。
for文はaの値やbの値にかかわらず、最大8回で終わる。プラス100で100回作業を繰り返していた前回のものよりも大幅に改善されている。