Need help in adding binary numbers in python

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

8 Answers

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.

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

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]

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'

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)

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)

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

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

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

You Might Also Like