聊聊指数运算的优化

我并不了解编译器内部怎样运作,但如果编译器不做的话,有些优化就需要程序员有所考量!
如果我们要算一个 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.
   }
}

你可能感兴趣的:(聊聊指数运算的优化)