Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中的二进制加法程序_Python_Python 3.x_Binary - Fatal编程技术网

python中的二进制加法程序

python中的二进制加法程序,python,python-3.x,binary,Python,Python 3.x,Binary,我正在编写一个二进制加法程序,但不确定为什么当输入以零开始时,输出是不正确的。当程序必须将零添加到其中一个输入的开始以使其长度相同时,输出也是不正确的 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 = 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)
a=input('输入第一个二进制数\t')
b=输入('输入第二个二进制数\t')
进位=0
答案=”“
长度=(最大(长度(a),长度(b))-min(长度(a,长度(b))
如果b>a:
a=长度*‘0’+a
如果a>b:
b=长度*'0'+b
印刷品(a)
印刷品(b)
对于范围内的i(len(a)-1,-1,-1):
x=进位
如果a[i]=“1”:x+=1
其他:x=0
如果b[i]=“1”:x+=1
其他:x=0
如果x%2==1:答案='1'+答案
其他:答案='0'+答案
如果x<2:进位=0
其他:进位=1
如果进位==1:答案='1'+答案
打印(答案)

探索布尔逻辑的绝佳机会

这样的二进制加法可以用两个“半加法器”和一个“或”来完成

首先是“半加法器”,它是一个异或,给你一个求和输出和一个,给你一个进位

[根据注释编辑:python确实有一个XOR实现为
^
,但不像
那样是一个“词”。我保留原样的答案,因为它解释了二进制加法后面的布尔逻辑]

由于python没有XOR,我们必须编写一个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 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 xor(bit_a, bit_b):
    return int(bit_a != bit_b)
这是非常有效的,但我在这里使用的是布尔示例

然后,我们对“半加法器”进行编码,它有两个输入(位a,位b),并给出两个输出:求和的XOR和进位的and:

def half_adder(bit_a, bit_b):
    return (xor(bit_a, bit_b), bit_a and bit_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 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]

如您所见,它将有3个输入(位a、位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)
如果您想将全加器视为一个逻辑图,它将如下所示:

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 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]

然后,我们需要调用这个全加器,从最低有效位(LSB)开始,以0作为进位,然后一直到最高有效位(MSB),在这里我们将进位作为下一步的输入,如下所示的4位:

这将产生如下结果:

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 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]
正如您所见,我们需要反转
结果
字符串,因为我们以“错误的方式”构建了它

将其全部组合为完整的工作代码:

# 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或i2计算位和,并通过(i1&i2)计算进位。如果b>a:
部分位于顶部,则我怀疑
。您在这里比较字符串。我确信您想要比较字符串的长度。当任意一位为
0
时,您都会丢弃进位。你确定没问题吗?@shuttle87。。。嗯。。。一定是星期五。。。我将保留原样的答案,因为它确实解释了原样的布尔逻辑。@shuttle87谢谢你,我在我的答案中添加了一个注释以澄清。哇,谢谢!您的布尔二进制加法器令人惊讶,但感谢您修复我的代码。