在Python中如何实现二进制数的加法?

19
如果我有两个用字符串表示的二进制数,并想将它们相加,我将从最右边的数字开始逐位相加。所以001 + 010 = 011。但是如果我要计算001+001,我应该如何编写代码来确定如何进行进位操作?

1
你目前尝试了什么?你应该记录下你的一些尝试,这样问题才不会过早关闭。 - jww
9个回答

42

binint在这里非常有用:

a = '001'
b = '011'

c = bin(int(a,2) + int(b,2))
# 0b100

int 可以让你在从字符串(这里是二进制)转换为整数时指定第一个参数的进制,而 bin 则将一个数字转换回二进制字符串。


12

这个函数接受任意数量的参数:

>>> def bin_add(*bin_nums: str) -> str: 
...     return bin(sum(int(x, 2) for x in bin_nums))[2:]
...
>>> x = bin_add('1', '10', '100')
>>> x
'111'
>>> int(x, base = 2)
7

8

这里有一个易于理解的版本

def binAdd(s1, s2):
    if not s1 or not s2:
        return ''

    maxlen = max(len(s1), len(s2))

    s1 = s1.zfill(maxlen)
    s2 = s2.zfill(maxlen)

    result  = ''
    carry   = 0

    i = maxlen - 1
    while(i >= 0):
        s = int(s1[i]) + int(s2[i])
        if s == 2: #1+1
            if carry == 0:
                carry = 1
                result = "%s%s" % (result, '0')
            else:
                result = "%s%s" % (result, '1')
        elif s == 1: # 1+0
            if carry == 1:
                result = "%s%s" % (result, '0')
            else:
                result = "%s%s" % (result, '1')
        else: # 0+0
            if carry == 1:
                result = "%s%s" % (result, '1')
                carry = 0   
            else:
                result = "%s%s" % (result, '0') 

        i = i - 1;

    if carry>0:
        result = "%s%s" % (result, '1')
    return result[::-1]

5

如果您通过int解析字符串,这可能很简单(如其他答案所示)。 这是一个“幼儿园数学”的方法:

>>> def add(x,y):
        maxlen = max(len(x), len(y))

        #Normalize lengths
        x = x.zfill(maxlen)
        y = y.zfill(maxlen)

        result = ''
        carry = 0

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

            # r can be 0,1,2,3 (carry + x[i] + y[i])
            # and among these, for r==1 and r==3 you will have result bit = 1
            # for r==2 and r==3 you will have carry = 1

            result = ('1' if r % 2 == 1 else '0') + result
            carry = 0 if r < 2 else 1       

        if carry !=0 : result = '1' + result

        return result.zfill(maxlen)

>>> add('1','111')
'1000'
>>> add('111','111')
'1110'
>>> add('111','1000')
'1111'

谢谢 - 这个在做像添加浮点数这样的事情时非常有用,因为它们可能有很多左边的零,这些零会被许多其他加法方法丢弃。我相信有实际的库可以做浮点数相加,但当你试图学习它们的工作原理时,这个工具非常方便;-) - undefined

1

双向工作

# as strings
a = "0b001"
b = "0b010"
c = bin(int(a, 2) + int(b, 2))

# as binary numbers
a = 0b001
b = 0b010
c = bin(a + b)

0

def addBinary(self, A, B): min_len, res, carry, i, j = min(len(A), len(B)), '', 0, len(A) - 1, len(B) - 1 while i>=0 and j>=0: r = carry r += 1 if A[i] == '1' else 0 r += 1 if B[j] == '1' else 0 res = ('1' if r % 2 == 1 else '0') + res carry = 0 if r < 2 else 1 i -= 1 j -= 1

    while i>=0:
        r = carry
        r += 1 if A[i] == '1' else 0
        res = ('1' if r % 2 == 1 else '0') + res
        carry = 0 if r < 2 else 1
        i -= 1
    
    while j>=0:
        r = carry
        r += 1 if B[j] == '1' else 0
        res = ('1' if r % 2 == 1 else '0') + res
        carry = 0 if r < 2 else 1
        j -= 1
    if carry == 1:
        return '1' + res
    return res

1
目前你的回答不够清晰,请[编辑]以添加更多细节,帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Cristik

0

#不使用内置函数'bin'实现两个二进制字符串的加法

numb1 = input('enter the 1st binary number')
numb2 = input("enter the 2nd binary number")
list1 = []
carry = '0'


maxlen = max(len(numb1), len(numb2))
x = numb1.zfill(maxlen)
y = numb2.zfill(maxlen)


for j in range(maxlen-1,-1,-1):
    d1 = x[j]
    d2 = y[j]
    if d1 == '0' and d2 =='0' and carry =='0':
        list1.append('0')
        carry = '0'
    elif d1 == '1' and d2 =='1' and carry =='1':
        list1.append('1')
        carry = '1'
    elif (d1 == '1' and d2 =='0' and carry =='0') or (d1 == '0' and d2 =='1' and 
carry =='0') or (d1 == '0' and d2 =='0' and carry =='1'):
        list1.append('1')
        carry = '0'
    elif d1 == '1' and d2 =='1' and carry =='0':
        list1.append('0')
        carry = '1'
    else:
        list1.append('0')


    
if carry == '1':
    list1.append('1')

addition = ''.join(list1[::-1])
print(addition)

0

你可以使用我编写的这个函数:

def addBinary(self, a, b):
    """
    :type a: str
    :type b: str
    :rtype: str
    """
    #a = int('10110', 2) #(0*2** 0)+(1*2**1)+(1*2**2)+(0*2**3)+(1*2**4) = 22
    #b = int('1011', 2) #(1*2** 0)+(1*2**1)+(0*2**2)+(1*2**3) = 11

    sum = int(a, 2) + int(b, 2)

    if sum == 0: return "0"

    out = []

    while sum > 0:
        res = int(sum) % 2
        out.insert(0, str(res))
        sum = sum/2


    return ''.join(out)

-2

这不是最优解决方案,但是它可以工作而且没有使用任何内置函数。

    # two approaches

    # first - binary to decimal conversion, add and then decimal to binary conversion
    # second - binary addition normally


    # binary addition - optimal approach
    # rules
    # 1 + 0 = 1
    # 1 + 1 = 0 (carry - 1)
    # 1 + 1 + 1(carry) = 1 (carry -1)

    aa = a
    bb = b
    len_a = len(aa) 
    len_b = len(bb) 

    min_len = min(len_a, len_b) 
    carry = 0
    arr = []

    while min_len > 0:
        last_digit_aa = int(aa[len(aa)-1]) 
        last_digit_bb = int(bb[len(bb)-1]) 

        add_digits = last_digit_aa + last_digit_bb + carry
        carry = 0
        if add_digits == 2:
            add_digits = 0
            carry = 1
        if add_digits == 3:
            add_digits = 1
            carry = 1

        arr.append(add_digits) # will rev this at the very end for output
        aa = aa[:-1]
        bb = bb[:-1]
        min_len -= 1

    a_len_after = len(aa)
    b_len_after = len(bb)

    if a_len_after > 0:
        while a_len_after > 0:
            while carry == 1:
                if len(aa) > 0:
                    sum_digit = int(aa[len(aa) - 1]) + carry
                    if sum_digit == 2:
                        sum_digit = 0
                        carry = 1
                        arr.append(sum_digit)
                        aa = aa[:-1]
                    else:
                        carry = 0
                        arr.append(sum_digit)
                        aa = aa[:-1]
                else:
                    arr.append(carry)
                    carry = 0

            if carry == 0 and len(aa) > 0:
                arr.append(aa[len(aa) - 1])
                aa = aa[:-1]
            a_len_after -= 1

    if b_len_after > 0:
        while b_len_after > 0:
            while carry == 1:
                if len(bb) > 0:
                    sum_digit = int(bb[len(bb) - 1]) + carry
                    if sum_digit == 2:
                        sum_digit = 0
                        carry = 1
                        arr.append(sum_digit)
                        bb = bb[:-1]
                    else:
                        carry = 0
                        arr.append(sum_digit)
                        bb = bb[:-1]
                else:
                    arr.append(carry)
                    carry = 0

            if carry == 0 and len(bb) > 0:
                arr.append(bb[len(bb) - 1])
                bb = bb[:-1]
            b_len_after -= 1

    if carry == 1:
        arr.append(carry)

    out_arr = reversed(arr)
    out_str = "".join(str(x) for x in out_arr)
    return out_str

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接