题目链接
剑指 Offer 16. 数值的整数次方
题目描述
![](https://img2020.cnblogs.com/blog/1179840/202009/1179840-20200918113018927-1507315894.png)
解题思路
幂次方的计算:常规方法就是写个for循环,但是在本题会超时,所以不可取。
本题就要考察就是快速幂以及位运算的相关知识。
![](https://img2020.cnblogs.com/blog/1179840/202009/1179840-20200918113404491-527160659.png)
注意事项:
有符号位移和无符号位移
有符号、无符号 看的就是二进制的符号位
- 无符号:就不管符号位,右移只填充0;
- 有符号,就是符号位是啥,我就填充啥
<< : 带符号左移运算符,num << 1
,相当于num乘以2
>> : 带符号右移运算符,num >> 1
,相当于num除以2
>>> : 无符号右移,忽略符号位,空位都以0补齐
AC代码
class Solution {
public double myPow(double x, int n) {
double ans = 1;
long exp = n;
if(x == 1) return ans;
if(n == 0) return ans;
if(n < 0){
x = 1.0 / x;
exp = n * -1;
}
while(exp != 0){
//注意必须是(exp&1)==1,而不能是exp&1==1
if((exp&1) == 1) ans *= x;
exp = exp >>> 1;
x *= x;
}
return ans;
}
}