我并不了解编译器内部怎样运作,但如果编译器不做的话,有些优化就需要程序员有所考量!
如果我们要算一个 y=x^13
我们如果这接算,就需要12次乘法运算,如果是浮点数,那开销很大。
我们这样做 y=x13=x8 * x^4 * x
t1=x^2
t2=t1^2
t3=t2^2
y=t3t2x
这样总共5次乘法
再来个例子 y=x^27
需要26次乘法运算,显然这不是我们需要的结果。
改成这样
y= ((x3)3)^3
只需要6次乘法就得到结果,计算机显然更喜欢这样。
现在,我们来抽象一下我们的算法
int iexp(int x, unsigned n) {
int p, y;
y = 1; // Initialize result
p = x; // and p.
while(1) {
if (n & 1) y = p*y; // If n is odd, mult by p.
n = n >> 1; // Position next bit of n.
if (n == 0) return y; // If no more bits in n.
p = p*p; // Power for next bit of n.
}
}