20

If I have 2 numbers in binary form as a string, and I want to add them I will do it digit by digit, from the right most end. So 001 + 010 = 011 But suppose I have to do 001+001, how should I create a code to figure out how to take carry over responses?

1
  • 1
    What have you tried so far? You should document some of your attempts so the question is not closed prematurely. Commented Jan 29, 2014 at 7:25

9 Answers 9

43

bin and int are very useful here:

a = '001'
b = '011'

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

int allows you to specify what base the first argument is in when converting from a string (in this case two), and bin converts a number back to a binary string.

Sign up to request clarification or add additional context in comments.

Comments

12

This accepts an arbitrary number or arguments:

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

Comments

8

Here's an easy to understand version

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]

Comments

5

Can be simple if you parse the strings by int (shown in the other answer). Here is a kindergarten-school-math way:

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

1 Comment

thanks -- this is super useful when doing things like adding floats since they may have a bunch of zeroes to the left which get discarded by many other addition methods. I'm sure there are actual libraries to do float addition, but when you're trying to learn how they work, this comes in handy ;-)
1

It works both ways

# 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)

Comments

0

you can use this function I did:

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)

Comments

0

#addition of two binary string without using 'bin' inbuilt function

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)

Comments

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 Comment

As it’s currently written, your answer is unclear. Please edit to add additional details that will help others understand how this addresses the question asked. You can find more information on how to write good answers in the help center.
-2

Not an optimal solution but a working one without use of any inbuilt functions.

    # 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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.