Diamonddeo
Diamonddeo

Reputation: 21

Addition of two binaries numbers in Python

Hey guys i have a trouble when i want to add two binaries numbers in Python, i mean i can enter a chain of character in a form of a string but i don't know how to select a specific value in the chain. Here is my code:

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

Upvotes: 0

Views: 1326

Answers (4)

gboffi
gboffi

Reputation: 25023

A couple of suggestions

  1. normalize the lengths of the bit strings

    l0, l1 = map(len, (str0, str1))
    if l0 < l1:
        str0 = "0"*(l1-l0) + str0
    elif l1 < l0:
        str1 = "0"*(l0-l1) + str1
    
  2. do a loop on the reversed strings elements and construct the binary string bottom up

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

writing f(bit_0, bit_1, remainder) and treating what to do if remainder is not null at the end of the loop is left as an exercise.

Upvotes: 0

Martin Frodl
Martin Frodl

Reputation: 657

To add two binary numbers chaina and chainb:

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

Or, if you want the binary number without the leading '0b':

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

Explanation

Assume for illustration that chaina = '1010' and chainb = '1111'. Then:

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

By applying eval() on this string, we get the same result as if we typed the expression 0b1010 + 0b1111 directly into Python console.

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

Finally, bin() produces a binary representation of the number passed to it as an argument:

>>> bin(25)
'0b11001'

The same thing is accomplished by calling format() with a 'b' argument:

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

All put together, we are getting the expressions shown above.

Upvotes: 1

Serge Ballesta
Serge Ballesta

Reputation: 148965

Assuming that you want to do a binary sum by hand, you must:

  • process both numbers starting from the end (reversed will help here)
  • consistently add bits processing carry until the lengther of both numbers is exhausted
  • reorder the result bits (here again reversed)

Code could be (assuming that you can be sure that chaina and chainb only consist in 0 and 1 characters, no test for it here):

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)

Upvotes: 0

Uwe Ziegenhagen
Uwe Ziegenhagen

Reputation: 694

Why don't you simply convert them into decimal and add them as you would do with decimals:

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

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

Upvotes: 0

Related Questions