通过重复加法来二进制化

时间:2019-07-01 11:37:27

标签: python binary multiplication

假设我们正在尝试将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 个答案:

答案 0 :(得分:1)

您可以通过从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”设置为“向其自身添加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]