常规方法
class Solution {
public:
bool isPowerOfTwo(int n) {
if(n <= 0) return false;
while(n > 1){
if(n % 2) return false;
n /= 2;
}
return true;
}
};
位运算
2的幂次方在二进制下,只有1位是1,其余全是0
负数的在计算机中二进制表示为补码(原码->正常二进制表示,原码按位取反(0-1,1-0),最后再+1。然后两者进行与操作,得到的肯定是原码中最后一个二进制的1。
8&(-8)->00001000 & 11111000 得 00001000,也就是8
class Solution {
public:
bool isPowerOfTwo(int n) {
return n > 0 && (n & -n) == n;
}
};
或者
return n > 0 and n & (n - 1) == 0;
也可以。
既然可以使用位运算,那当然也可以使用bitset:
class Solution {
public:
bool isPowerOfTwo(int n) {
return n > 0 && bitset<32>(n).count() == 1;
}
};