我知道计算机使用shift和add方法来乘以两个数字。
逐位移位乘以并除以2的幂。此操作比乘法指令快。 通过常数乘法和除以常数可以使用一系列移位和加法或减法来实现。
((x << 2) + x) << 1 // Here 10*x is computed as (x*2^2 + x)*2
(x << 3) + (x << 1) // Here 10*x is computed as x*2^3 + x*2
但是有更快的算法吗?
Thx求助:)
答案 0 :(得分:3)
编译器使用本机汇编指令的任何组合都是最有效的。
当乘以常数时,编译器将根据每个策略成本的周期数和二进制代码大小选择直接乘法或移位。它通常是低级优化器的工作,需要准确了解运行代码的处理器。
你在这场比赛中没有击败编译器。
答案 1 :(得分:2)
对于非常大的n
s(大致为1000位数),有专门的算法,按强度递增顺序为:Karatsuba,Toom-Cook,最后是100000的怪物数字乘法:Schönhage-Strassen。
由于它们的开销,它们在较小的数字上表现不佳,但渐渐地它们比天真的乘法要好得多。