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

技术算法

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      1     0     1
128    64    32    16

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

转化为算法:

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
}
创建于2018年02月24日 12:23
阅读量 754
留言列表

暂时没有留言

添加留言