int poww(int a, int b) {
int ans = 1, base = a;
while (b != 0) { //如果b的所有位都被踢掉 也就是b不存在了 那么就没有指数了 就算不出下去了 也没有可以算得了 也不需要算了 就可以跳出循环
if (b & 1 != 0) //判断b的二进制的最后一位是否1 如果b & 1 != 0 也就是b(二进制)的最后一位等于1(不等于0) b此时是奇数
ans *= base; //(在if语句中的 )如果指数是奇数的话 ((((看下面)))))
base *= base; // 这步相当于让a指数变成(2^权)
b >>= 1; //把b(二进制)的最后一位踢掉(在就不存在了)
}
return ans;
}
以2的11次方为例
2^11
11的二进制为1101
所以11=1*2^3 + 1*2^2 + 0*2*1 + 1*2^0
a^11=a^(1*2^3 + 1*2^2 + 0*2*1 + 1*2^0)
扫描二维码关注公众号,回复:
4315873 查看本文章
=a^(1*2^3) * a^(1*2^2) * a^(0*2*1) * a^(1*2^0)
if (b & 1 != 0) 一步步判断b的二进制的每一位 如果是零 即指数为0*~~ 0乘任何数肯定等于0了啊 所以某一位一旦指数等于0 就可以相当于那一步乘法因数是1 就完全可以忽略它了