给定一个整数,编写一个函数来判断它是否是 2 的幂次方。
示例 1:
输入: 1
输出: true
解释: 20 = 1
示例 2:
输入: 16
输出: true
解释: 24 = 16
示例 3:
输入: 218
输出: false
解1:位运算。不管是2的正幂次还是2的负幂次肯定都大于0,如果n小于0可以直接返回false,2的负幂次如2^-3等价于1/2^3一定是小数,由于入参为int所以这种情况也不存在。所以看表格,很清晰,如果n&(n-1)为0那说明是。
2的幂次 | 十进制形式 | 二进制形式 | 减1二进制形式 |
---|---|---|---|
2 ^ 0 | 1 | 00000001 | 00000000 |
2 ^ 1 | 2 | 00000010 | 00000001 |
2 ^ 2 | 4 | 00000100 | 00000100 |
2 ^ 3 | 8 | 00001000 | 00000111 |
2 ^ 4 | 16 | 00010000 | 00001111 |
2 ^ 5 | 32 | 00100000 | 00011111 |
2 ^ 6 | 64 | 01000000 | 00111111 |
… | … | … | … |
class Solution {
public boolean isPowerOfTwo(int n) {
return (n > 0) && ((n & (n - 1)) == 0);
}
}
解2:
class Solution {
public boolean isPowerOfTwo(int n) {
//return (n > 0) && ((n & (n - 1)) == 0);
if (n < 1) {
return false;
}
while (n != 1) {
if (n % 2 == 1) {
return false;
}
n /= 2;
}
return true;
}
}