解题思路:
如果一个数是2的次方数,那么这个数的二进制表示中,只有最高位是1,其余都是0;那么,我们就可以统计二进制是1的个数n,cnt大于1则false,cnt==1则true
1,先决条件:n>0, 如果n<=0, 这题就没卵用
2,不变式:在循环中执行 cnt += n&1,n右移一位
3,结束条件:n==0
4,临界条件:(n>0, 如果n<=0, 这题就没卵用)
class Solution {
public:
bool isPowerOfTwo(int n) {
int cnt = 0;
while (n > 0){
cnt += (n & 1);
n >>= 1;
}
return cnt == 1;
}
};
解法二:
n如果是2的次方数,那么n的二进制表示中,只有最高位为1,而n-1的二进制表示中,只有第一位为0,其余都为1
这两个数做与运算,结果已定为零
一句话就能搞定
1,先决条件:n > 0
2,不变式:(n & (n-1))
3,临界条件:n > 0
// Error:(n & (n-1)) 为false时返回true,忘记在前面加 !
class Solution {
public:
bool isPowerOfTwo(int n) {
return (n > 0) && !(n & (n-1));
}
};