题目大意:判断整数是否是2的幂次方
分析:二进制位运算
方法一:n不断除以2再模2判断余数是否为0,时间复杂度O(logn)。
方法二:位运算,时间复杂度O(1)。2的幂次方数是由2^0不断×2得到的,也就是1不断左移的过程,所以2的幂次方数的二进制都是最高位为1,其余位都是0的。而这个数-1之后变成最高位为0,其余位都是1。所以有n&(n-1)=0。注意n≤0时一定返回false,所以先排除,不然测试数据有INT_MIN,INT_MIN-1就会造成溢出问题。
代码:
class Solution {
public:
bool isPowerOfTwo(int n) {
return n > 0 && !(n & (n - 1));
}
};