昨日リンクした米子高専の学習資料みてたら、Borrow はつまり引き算の筆算のとき上の桁から1を借りることと同じだと書いてあり、また、半減算器の連結のしかたが下の桁からやっていくことになっているような記述がある。あ.... たしかに。ついつい桁DPのイメージがあって上から決めていくんだとおもいこんでいたのでどういうことだ?と混乱していたが、2進数でも10進数と同じように上の桁から借りてくるということか。ということで、関数を作りなおした。ま、減算器に入れる前にひっくり返して、出てきたときにもひっくり返したらいいだろ(安直)
def fSub2( iA,iB): bA = format(iA,'b') bB = format(iB,'b') iLA = len(bA) iLB = len(bB) if iLA > iLB: bB = "0"*(iLA-iLB) + bB else: bA = "0"*(iLB-iLA) + bA iLA = iLB bA = bA[::-1] bB = bB[::-1] iB = 0 sBin = "" sD = "" sBout = "" for i in range(iLA): sBin += str(iB) iD , iB = cSub(int(bA[i]),int(bB[i]),iB) sBout += str(iB) sD += str(iD) sD = sD[::-1] sBin = sBin[::-1] sBout = sBout[::-1] iD = int(sD,2) iBin = int(sBin,2) iBout = int(sBout,2) return iD,iBin,iBout,iD + iBin - (iBout << 1)
するとこうなった。関数1が昨日作ったもので、関数2が上。
_____ 3445 5189 ______ 8634 半加 8634 8634 半加 8634 -1744 半減 6448 4096 -1744 -1744 関数1 (4400, 2048, 4096, -1744) -1744 関数2 (6448, 0, 4096, -1744) ______ 454 45 ______ 499 半加 499 499 半加 499 409 半減 491 41 409 409 関数1 (501, 30, 61, 409) 409 関数2 (409, 114, 57, 409)
すると結果がマイナスになる方は半減算器と同じ結果になった。結果が正になる方はDもBin Bout を加味した結果もいっしょ。結果がマイナスになる 3445 - 5189 はD が6448 で Bin が0、Bout が4096でこれを左シフトして二倍して引くのだが、2のべき乗なので先頭に1立ってるだけ。あ、そうか。2進数の補数と10進数の補数は違って当然だな..
- 作者: 松下昭
- 出版社/メーカー: 共立出版
- 発売日: 1976/04/05
- メディア: 単行本
- この商品を含むブログを見る
- 作者: 小倉久和
- 出版社/メーカー: 近代科学社
- 発売日: 2017/05/31
- メディア: Kindle版
- この商品を含むブログを見る