簡體   English   中英

python中的二進制加法程序

[英]Binary addition program in python

我正在編寫一個二進制加法程序,但不確定為什么當輸入以零開頭時輸出不正確。當程序必須在其中一個輸入的開頭添加零以使它們相同時,輸出也不正確長度。

a = input('Enter first binary number\t')
b = input('Enter second binary number\t')

carry = 0
answer = ""

length = (max(len(a),len(b))) - min(len(a),len(b))

if b > a:
    a = length * '0' +  a
elif a > b:
    b = length * '0' +  b

print(a)
print(b)

for i in range(len(a)-1, -1, -1):                     
    x = carry                                        
    if a[i] == '1': x += 1
    else: x = 0

    if b[i] == '1': x += 1
    else: x = 0

    if x % 2 == 1: answer = '1' + answer
    else: answer = '0' + answer

    if x < 2: carry = 0
    else: carry = 1

if carry == 1: answer = '1' + answer                    

print(answer)

這是探索一些布爾邏輯的絕佳機會。

可以使用兩個“半加器”和一個“或”來添加這樣的二進制文件

首先是“半加器”,它是一個 XOR 給你一個總和輸出和一個 AND 給你一個進位。

在此處輸入圖片說明

[根據評論編輯:python 確實有一個 XOR 實現為^但不是作為“單詞” like and not or 我將答案保持原樣,因為它正在解釋二進制加法背后的布爾邏輯]

由於 python 沒有 XOR,我們將不得不編寫一個。 XOR 本身是兩個 AND(具有反向輸入)和一個 OR,如下所示:

在此處輸入圖片說明

這將導致一個簡單的函數,如下所示:

def xor(bit_a, bit_b):
    A1 = bit_a and (not bit_b)
    A2 = (not bit_a) and bit_b
    return int(A1 or A2)

其他人可能想這樣寫:

def xor(bit_a, bit_b):
    return int(bit_a != bit_b)

這是非常有效的,但我在這里使用布爾示例。

然后我們對“半加器”進行編碼,它有 2 個輸入(bit_a,bit_b),並給出兩個輸出的和的異或和進位的與:

def half_adder(bit_a, bit_b):
    return (xor(bit_a, bit_b), bit_a and bit_b)

所以兩個“半加器”和一個“或”將形成一個“全加器”,如下所示:

在此處輸入圖片說明

如您所見,它將有 3 個輸入(bit_a、bit_b、進位)和兩個輸出(和和進位)。 這在 python 中看起來像這樣:

def full_adder(bit_a, bit_b, carry=0):
    sum1, carry1 = half_adder(bit_a, bit_b)
    sum2, carry2 = half_adder(sum1, carry)
    return (sum2, carry1 or carry2)

如果您喜歡將全加器視為一個邏輯圖,它看起來像這樣:

在此處輸入圖片說明

然后我們需要調用這個全加器,從最低有效位 (LSB) 開始,以 0 作為進位,然后工作到最高有效位 (MSB),我們將進位作為下一步的輸入,如下所示這里是 4 位:

在此處輸入圖片說明

這將是這樣的結果:

def binary_string_adder(bits_a, bits_b):
    carry = 0
    result = ''
    for i in range(len(bits_a)-1 , -1, -1):
        summ, carry = full_adder(int(bits_a[i]), int(bits_b[i]), carry)
        result += str(summ)
    result += str(carry)
    return result[::-1]

如您所見,我們需要反轉result字符串,因為我們以“錯誤的方式”構建它。

將它們放在一起作為完整的工作代碼:

# boolean binary string adder

def rjust_lenght(s1, s2, fill='0'):
    l1, l2 = len(s1), len(s2)
    if l1 > l2:
        s2 = s2.rjust(l1, fill)
    elif l2 > l1:
        s1 = s1.rjust(l2, fill)
    return (s1, s2)

def get_input():
    bits_a = input('input your first binary string  ')
    bits_b = input('input your second binary string ')
    return rjust_lenght(bits_a, bits_b)

def xor(bit_a, bit_b):
    A1 = bit_a and (not bit_b)
    A2 = (not bit_a) and bit_b
    return int(A1 or A2)

def half_adder(bit_a, bit_b):
    return (xor(bit_a, bit_b), bit_a and bit_b)

def full_adder(bit_a, bit_b, carry=0):
    sum1, carry1 = half_adder(bit_a, bit_b)
    sum2, carry2 = half_adder(sum1, carry)
    return (sum2, carry1 or carry2)

def binary_string_adder(bits_a, bits_b):
    carry = 0
    result = ''
    for i in range(len(bits_a)-1 , -1, -1):
        summ, carry = full_adder(int(bits_a[i]), int(bits_b[i]), carry)
        result += str(summ)
    result += str(carry)
    return result[::-1]

def main():
    bits_a, bits_b = get_input()
    print('1st string of bits is : {}, ({})'.format(bits_a, int(bits_a, 2)))
    print('2nd string of bits is : {}, ({})'.format(bits_b, int(bits_b, 2)))
    result = binary_string_adder(bits_a, bits_b)
    print('summarized is         : {}, ({})'.format(result, int(result, 2)))

if __name__ == '__main__':
    main()

用於圖片的兩個互聯網資源:

為了好玩,你可以用三行來做這件事,其中兩行實際上是獲取輸入:

bits_a = input('input your first binary string  ')
bits_b = input('input your second binary string ')
print('{0:b}'.format(int(bits_a, 2) + int(bits_b, 2)))

在您自己的代碼中,如果在第二次/后續迭代中,其中一位為 0,則您將丟棄進位,然后設置x = 0 ,其中包含前一次迭代的進位。

這就是我設法完成它的方式,希望你覺得這有用。

#Binary multiplication program.
def binaryAddition(bin0, bin1):
    c = 0
    answer = ''

    if len(bin0) > len(bin1):
        bin1 = (len(bin0) - len(bin1))*"0" + bin1

    elif len(bin1) > len(bin0):
        bin0 = (len(bin1) - len(bin0))*"0" + bin0  

    #Goes through the binary strings and tells the computer what the anser should be.
    for i in range(len(bin0)-1,-1,-1):
        j = bin0[i]
        k = bin1[i]
        j, k = int(j), int(k)

        if k + j + c == 0:
            c = 0
            answer = '0' + answer
        elif k + j + c == 1:
            c = 0
            answer = '1' + answer
        elif k + j + c == 2:
            c = 1
            answer = '0' + answer
        elif k + j + c == 3:
            c = 1
            answer = '1' + answer
        else:
            print("There is something wrong. Make sure all the numbers are a '1' or a '0'. Try again.") #One of the numbers is not a 1 or a 0.
            main()

    return answer


def binaryMultiplication(bin0,bin1):
    answer = '0'*8
    if len(bin0) > len(bin1):
        bin1 = (len(bin0) - len(bin1))*"0" + bin1

    elif len(bin1) > len(bin0):
        bin0 = (len(bin1) - len(bin0))*"0" + bin0

    for i in range(len(bin0)-1,-1,-1):
        if bin1[i] == '0':
            num = '0'*len(answer)
        elif bin1[i] == '1':
            num = bin0 + '0'*((len(bin0)-1)-i)
        answer = binaryAddition(num, answer)
    print(answer)


def main():
    try:
        bin0, bin1 = input("Input both binary inputs separated by a space.\n").split(" ")
    except:
        print("Something went wrong. Perhaps there was not a space between you numbers.")
        main()

    binaryMultiplication(bin0,bin1)

    choice = input("Do you want to go again?y/n\n").upper()
    if choice == 'Y':
        main()
    else: input()

main()

下面使用按位邏輯運算符將整數 i1 和 i2 相加(覆蓋 i1 和 i2)。 它通過 i1 xor i2 計算按位和,通過 (i1 & i2)<<1 計算進位。 它迭代直到移位寄存器為空。 一般來說,這將比逐位快得多

while i2:                               # check shift register != 0
    i1, i2 = i1^i2, (i1&i2) << 1        # update registers

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM