腾讯精选练习:231. 2的幂(位运算,lowbit)

231. 2的幂

给定一个整数,编写一个函数来判断它是否是 2 的幂次方。

示例 1:
输入: 1
输出: true
解释: 20 = 1

示例 2:
输入: 16
输出: true
解释: 24 = 16

分析1

如果是2的幂,那么取以2为底的log会得到一个整数
精度要自己设定。

class Solution {
public:
    bool isPowerOfTwo(int n) {
        if(n<=0) return false;
        double lg = log(n*1.0)/log(2);
        if(fabs(floor(lg)-lg) < 10e-12) return true;
        return false;
    }
};

分析2

第一种方法要设定精度,说明存在着一定的误差,如果从位运算的角度去考虑就没有误差了。
如果一个数是2的幂次方,那么这个数所对应的二进制一定是只有一个1的。
所以我们就看这个数有多少个二进制位是1就好了。但是这样做是 O ( l o g n ) O(logn) O(logn)的做法,为了更快,我们考虑以下:
1、在补码表示法里面, − x = ∼ x + 1 -x = \sim x + 1 x=x+1
2、由 1 可知, x & − x x \&-x x&x 得到的就是 x x x 最右边的 1。
3、如果 x x x 是 2 的幂次方,那么 x x x 最右边的 1 就是唯一的 1。
4、结论:如果 ( x & − x ) = = x (x \& -x)==x (x&x)==x,说明 x x x 是 2 的幂次方。
(实际上就是树状数组的 lowbit)

class Solution {
public:
    bool isPowerOfTwo(int n) {
        if(n==0) return false;
        long long x = n;
        x = x & (-x);
        if(x == n) return true;
        return false;
    }
};

你可能感兴趣的:(leetcode,位运算,思维题)