# BinaryAdd.tur: 2進数の加算。2001-03-23 # テープフォーマット: " " 2つの2進数を1つの空白で区切る。 # 例) 110 11011 (6+27 で答えは 100001) # # 下の桁から順に加算して行く。 # 計算中の被加算数では計算済みの桁は 0 を x で、1 を y で表す。 # 0 0 0 r 0; 被加算数(左の数)を読みとばす 0 1 1 r 0; 0 x x r 0; 0 y y r 0; 0 _ _ r 1; 区切りがあったので次は加算数 1 0 0 r 1; 加算数(右の数)の一番下の桁を探す 1 1 1 r 1; 1 _ _ l 2; おっと行きすぎた 2 0 _ l 3; 0 と 1 とで場合分け 2 1 _ l 5; 2 _ _ l 8; 加算数の桁がもう無いなら後始末へ 3 0 0 l 3; 0 の加算処理: 被加算数まで戻る 3 1 1 l 3; 3 _ _ l 4; 区切りがあったので左に被加算数がある 4 0 x r 0; 計算済みの印を付けて再び加算数を調べに行く 4 _ x r 0; 4 1 y r 0; 4 x x l 4; 計算済みの部分は読みとばす 4 y y l 4; 5 0 0 l 5; 1 の加算処理: 被加算数まで戻る 5 1 1 l 5; 5 _ _ l 6; 区切りがあったので左に被加算数がある 6 0 y r 0; 0 に足す場合は桁上がりはない 6 _ y r 0; 6 1 x l 7; 1 に足す場合は桁上がり 6 x x l 6; 計算済みの部分は読みとばす 6 y y l 6; 7 0 1 r 0; 桁上がりの処理: 0 に足す場合はもう桁上がりはない 7 _ 1 r 0; 7 1 0 l 7; 1 に足す場合は再び桁上がり 8 x 0 l 8; 後始末: x は 0 に戻す 8 y 1 l 8; y は 1 に戻す; それ以外が出て来たらおしまい。