python如何写二进制乘法_Python二进制乘法。分裂与征服

我需要理解为什么我的代码给出了错误的答案。任务是用分而治之的方法创建二进制乘法。我找到了一些描述这类问题的论文:

wikibooks algorithmsUTSC paper (page 4)

这是我的Python代码(3.5.2)def add(A, B):

a_str = "".join([str(a) for a in A])

b_str = "".join([str(b) for b in B])

bin_a = int(a_str, 2)

bin_b = int(b_str, 2)

return [int(a) for a in str(bin(bin_a + bin_b))[2:]]

def add_n(*args):

if len(args) <= 1:

return args[0]

bin_sum = [0]

for num in args:

bin_sum = add(bin_sum, num)

return bin_sum

def shift(A, n):

if n <= 0:

return A

a_str = "".join([str(a) for a in A])

bin_a = int(a_str, 2)

bin_a = bin(bin_a << n)

return [int(a) for a in str(bin_a)[2:]]

def lfill(A, n):

return [0] * (n - len(A)) + A

def multiply(A, B):

n = len(A)

half = n // 2

if n <= 1:

return [A[0] * B[0]]

xl, xh = A[:half], A[half:]

yl, yh = B[:half], B[half:]

a = multiply(xh, yh)

b = multiply(xh, yl)

c = multiply(xl, yh)

d = multiply(xl, yl)

b = add(b, c)

a = shift(a, n)

b = shift(b, half)

return add_n(a, b, d)

问题测试1:

^{pr2}$

问题测试2:A = [1, 1, 1, 1]

B = [0, 0, 0, 1]

result: [1, 1, 1, 1, 0, 0, 0]

real result: [1, 1, 1, 1]

测试2的值跟踪:n half

Before Shift [2, 1]: a: [1] b:[1]

After Shift: a: [1, 0, 0] b:[1, 0]

Before Shift [2, 1]: a: [0] b:[0]

After Shift: a: [0] b:[0]

Before Shift [2, 1]: a: [1] b:[1]

After Shift: a: [1, 0, 0] b:[1, 0]

Before Shift [2, 1]: a: [0] b:[0]

After Shift: a: [0] b:[0]

Before Shift [4, 2]: a: [1, 1, 0] b:[1, 1, 0]

After Shift: a: [1, 1, 0, 0, 0, 0, 0] b:[1, 1, 0, 0, 0]

所以,正如你所看到的,问题出在零的计数上,但不同的情况不同。这段代码不适用于所有长度不成对的二进制文件,但这不是问题,因为它可以很容易地规范化。在

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值