【LeetCode】50. Pow(x, n)(位运算、快速幂)

题目链接

剑指 Offer 16. 数值的整数次方

题目描述

解题思路

幂次方的计算:常规方法就是写个for循环,但是在本题会超时,所以不可取。

本题就要考察就是快速幂以及位运算的相关知识。

注意事项:

有符号位移和无符号位移

有符号、无符号 看的就是二进制的符号位

  • 无符号:就不管符号位,右移只填充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;
    }
}
原文地址:https://www.cnblogs.com/XDU-Lakers/p/13690342.html