Python中两个二进制数的加法

时间:2018-12-05 14:28:22

标签: python

大家好,我想在Python中添加两个二进制数字时遇到麻烦,我的意思是我可以以字符串形式输入字符链,但是我不知道如何在链中选择特定值。这是我的代码:

chaina = input('Enter your first binary number')
chainb = input('Enter your second binary number')
liste = str()
r = 0
for i in range [-1,chaina]:
   t = 0
   t = chaina() + chainb() + r
if t == 2 :
    r = 1
    liste = str(t) + liste            
elif t == 0 or t == 1:
     r = 0
     liste = str(t) + liste

4 个答案:

答案 0 :(得分:0)

为什么不简单地将它们转换为十进制并像对待小数一样添加它们:

y = '0b101010'
z = '0b101010'

print(int(y,2) + int(z,2))
print(bin((int(y,2) + int(z,2))))

答案 1 :(得分:0)

要添加两个二进制数字chainachainb

bin(eval('0b{} + 0b{}'.format(chaina, chainb)))

或者,如果您想要不带前导'0b'的二进制数:

format(eval('0b{} + 0b{}'.format(chaina, chainb)), 'b')

说明

假设示例为chaina = '1010'chainb = '1111'。然后:

>>> '0b{} + 0b{}'.format(chaina, chainb)
'0b1010 + 0b1111'

通过在此字符串上应用eval(),我们得到的结果与直接在Python控制台中键入表达式0b1010 + 0b1111一样。

>>> 0b1010 + 0b1111
25
>>> eval('0b1010 + 0b1111')
25

最后,bin()生成以二进制形式表示作为参数传递给它的数字:

>>> bin(25)
'0b11001'

通过使用format()参数调用'b'可以实现相同的目的:

>>> format(25, 'b')
'11001'

所有内容放在一起,我们得到上面显示的表达式。

答案 2 :(得分:0)

假设您想手动进行二进制和 ,则必须:

  • 从末尾开始处理两个数字(reversed会有所帮助)
  • 一致地添加处理位,直到两个数字的长号用尽为止
  • 重新排列结果位(此处再次为reversed

代码可能是(假设您可以确定chainachainb仅包含01字符,在这里无需对其进行测试):

def binsum(chaina, chainb):
    def next0(it):
        """Retrieve next digit from a binary representation, 0 when exhausted"""
        try:
            return int(next(it))
        except StopIteration:
            return 0
    a = reversed(chaina)  # reverse chains to start with lowest order bit
    b = reversed(chainb)
    r = 0
    result = []           # future result
    for i in range(n):
        t = next0(a) + next0(b) + r  # add with carry
        if t > 1:
            t -= 2
            r = 1
        else:
            r = 0
        result.append('1' if t else '0')
    if r != 0:                        # do not forget last carry
        result.append('1')
    return ''.join(result)

答案 3 :(得分:0)

一些建议

  1. 标准化位串的长度

    l0, l1 = map(len, (str0, str1))
    if l0 < l1:
        str0 = "0"*(l1-l0) + str0
    elif l1 < l0:
        str1 = "0"*(l0-l1) + str1
    
  2. 对反向字符串元素进行循环,并自底向上构造二进制字符串

    remainder = 0
    result = ""
    for bit_0, bit1 in zip(reversed(str0), reversed(str1)):
        bit_0, bit_1 = map(int, (bit_0, bit_1))
        new_bit, remainder = f(bit_0, bit_1, remainder)
        result = str(new_bit) + result
    if remainder != 0
        ...
    

编写f(bit_0, bit_1, remainder)并在循环结束时处理remainder不为null时该怎么做。