メモ@inudaisho

君見ずや出版 / 興味次第の調べ物置き場

減算器を実装してみた その2

 昨日リンクした米子高専の学習資料みてたら、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進数の補数は違って当然だな..

ディジタル情報工学入門―論理演算と設計―

ディジタル情報工学入門―論理演算と設計―

離散数学への入門:わかりやすい離散数学

離散数学への入門:わかりやすい離散数学