需要帮助在python中添加二进制数

问题描述 投票:10回答:5

如果我有二进制形式的2个数字作为字符串,并且我想添加它们,我将从最右端开始逐位数字。所以001 + 010 = 011但是假设我必须做001 + 001,我应该如何创建一个代码来弄清楚如何进行转移响应?

python binary addition
5个回答
33
投票

binint在这里非常有用:

a = '001'
b = '011'

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

int允许您指定从字符串转换时第一个参数的基数(在本例中为2),bin将数字转换回二进制字符串。


7
投票

这接受任意数量或参数:

def bin_add(*args): return bin(sum(int(x, 2) for x in args))[2:]

>>> bin_add('1', '10', '100')
'111'

5
投票

这是一个易于理解的版本

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]

2
投票

如果你通过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'

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)
© www.soinside.com 2019 - 2024. All rights reserved.