Jos*_*eph 0 python binary python-3.x
我正在编写一个二进制加法程序,但不确定为什么输入以零开头时输出是不正确的,当程序必须在输入之一的开头加上零以使它们相同时,输出也是不正确的长度。
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)
Run Code Online (Sandbox Code Playgroud)
探索布尔逻辑的绝佳机会。
像这样添加二进制文件可以使用两个“半加法器”和一个“或”来完成
首先是“半加法器”,它是一个“异或”运算,可为您提供求和的输出,而“与”运算则是可带进位。
[根据注释进行编辑:python确实将XOR实现为,^但没有实现为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)
Run Code Online (Sandbox Code Playgroud)
其他人可能想这样写:
def xor(bit_a, bit_b):
return int(bit_a != bit_b)
Run Code Online (Sandbox Code Playgroud)
这是非常有效的,但是我在这里使用布尔型示例。
然后,我们对“半加法器”进行编码,该半加法器具有2个输入(bit_a,bit_b),并给出两个输出,它们的总和为XOR,进位为AND:
def half_adder(bit_a, bit_b):
return (xor(bit_a, bit_b), bit_a and bit_b)
Run Code Online (Sandbox Code Playgroud)
因此,两个“半加器”和一个“或”将组成一个“全加器”,如下所示:
如您所见,它将有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)
Run Code Online (Sandbox Code Playgroud)
如果您想将Full Adder视为一个逻辑图,它将看起来像这样:
然后我们需要调用此全加法器,从最低有效位(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]
Run Code Online (Sandbox Code Playgroud)
如您所见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()
Run Code Online (Sandbox Code Playgroud)
用于图片的两个互联网资源:
为了好玩,您可以分三行进行操作,其中两行实际上是在获取输入:
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)))
Run Code Online (Sandbox Code Playgroud)
在您自己的代码中,如果在第二次/后续迭代中某个位为0,则您将x = 0舍弃进位,然后进行设置,其中包含先前发散的进位。