举个简单的例子理解一下吧,比如pow(5,13),正常算的话需要执行乘法15次吧。可是如果采用快速幂,只要进行只要四次运算就ok了。13的二进制为1101,每一位分别代表8,4,2,1。

原理很简单,x每轮都自乘,若遇到当前二进制为1的话,就乘与x。有点词穷了,附上代码赋值理解吧。

class Solution {
public:
double myPow(double x, int n) {
//位运算
if(x==0) return 0;
long b=n;
double res=1;
//如果n小于0,等与pow(1/x,-n)
if(b<0){
x=1/x;
b=-b;
}
while(b>0)
{
if((b&1)==1) res*=x;
x*=x;
b=b>>1;
}
return res;
}
};