0%

使用加法和位运算实现简单乘法

m * n 就是将 m 进行 n 次累加。如果简单的使用 for 循环,当循环次数很大时无疑很慢。

因此我们可以考虑使用迭代。“一生二,二生三,三生万物”,这句话在这里可以得到体现。比如 5 * 9,1 * 9 = 9;2 * 9 = 9 + 9 =18;4 * 9 = 18 + 18 = 36;5 * 9 = 36 + 9 = 45;

因此 5 * 9 最终转化为了 4 * 9 + 1 * 9。乘法转化为了加法。通过观察可以发现 5 的 二进制为 0b101,刚好符合 4 * 9 + 1 * 9。

因此任何乘法都可以转换为加法。m * n,将 m 转为 2 进制,然后逐位求出其位数对应的乘积,相加便是最终的结果。

例如 13 * 16, 13可以转化为 0b1101,依次迭代,

1
2
1      1     0     1
128 64 32 16

结果相加为 128 + 64 + 16 = 208 。

转化为算法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
func mul(m int, n int) int {
//将较小者进行迭代可以减少循环次数
if m > n {
m, n = n, m
}
result := 0
for m > 0 {
//取余运算
if m&1 == 1 {
result = n + result
}
//n = 2*n,对应例子中的第二行
n = n << 1
//m = m/2,对应例子中的第一行
m = m >> 1
}
return result
}

Gitalk 加载中 ...