Reineir Duran
Reineir Duran

Reputation: 11

Multiplication of binaries through repeated addition

Let's say we're trying to multiply 10011 and 1101 (or in arithmetic terms, 19 x 13). We all know that this is the same as adding 10011 to itself 13 times or vice versa. Apparently, I've found a code at https://www.w3resource.com/python-exercises/challenges/1/python-challenges-1-exercise-31.php which provided a way on how to add two binary numbers. My question is, in general, if we multiply two binary numbers A and B, how are we going to iterate A to add itself B times? Obviously, in order to do that we have to convert B to decimal/integer first.

def add_binary_nums(x, y):
    max_len = max(len(x), len(y))

    x = x.zfill(max_len)
    y = y.zfill(max_len)

    result = ''
    carry = 0

    for i in range(max_len-1, -1, -1):
        r = carry
        r += 1 if x[i] == '1' else 0
        r += 1 if y[i] == '1' else 0
        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(max_len)

print(add_binary_nums('11', '1'))

Upvotes: 1

Views: 572

Answers (1)

MisterMiyagi
MisterMiyagi

Reputation: 50116

You can count up to a number by starting at 0 and adding 1 until you are done. Since you already have defined a binary add, you only need to add the loop:

def binary_range(stop: str):
    """Count `stop` times"""
    current = '0'
    while stop != current:
        yield current
        current = add_binary_nums(current, '1')

This is enough to do something "n times". You can now do "a * b" as "add a to itself b times":

def binary_mul(a: str, b: str):
    """Multiplay the binary ``a`` by the binary ``b``"""
    result = '0'
    for _ in binary_range(b):
        result = add_binary_nums(result, a)
    return result

If you don't care about building a binary calculator, use Python to convert binary to integers or vice versa. int(bin_string, 2) converts a string such as "01101" to the appropriate integer, and bin(integer) converts it back to "0b01101".

For example, a binary multiplication that takes and returns strings looks like this:

def binary_mul(a: str, b: str):
    return bin(int(a, 2) * int(b, 2))[:2]

Upvotes: 1

Related Questions