Умножение двоичных файлов путем многократного добавления - PullRequest
1 голос
/ 01 июля 2019

Допустим, мы пытаемся умножить 10011 и 1101 (или в арифметическом выражении, 19 x 13).Все мы знаем, что это то же самое, что добавить 10011 к себе 13 раз или наоборот.По-видимому, я нашел код на https://www.w3resource.com/python-exercises/challenges/1/python-challenges-1-exercise-31.php, который предоставил способ добавления двух двоичных чисел.Мой вопрос, в общем, если мы умножим два двоичных числа A и B, как мы будем перебирать A, чтобы добавить себя B раз?Очевидно, что для этого мы должны сначала преобразовать B в десятичное / целое число.

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

1 Ответ

1 голос
/ 01 июля 2019

Вы можете считать до числа, начиная с 0 и добавляя 1, пока не закончите.Поскольку вы уже определили двоичный файл add, вам нужно только добавить цикл:

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

Этого достаточно, чтобы сделать что-то "n раз".Теперь вы можете сделать «a * b» как «добавить a к себе b раз»:

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

Если вы не заботитесь о построении двоичного калькулятора, используйте Python для преобразования двоичного числа в целые числаили наоборот.int(bin_string, 2) преобразует строку, такую ​​как "01101", в соответствующее целое число, а bin(integer) преобразует ее обратно в "0b01101".

Например, двоичное умножение, которое принимает и возвращает строки, выглядит следующим образом:

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