给定一个整数,编写一个函数来判断它是否是 2 的幂次方。
示例 1:
输入: 1
输出: true
解释: 20 = 1
示例 2:
输入: 16
输出: true
解释: 24 = 16
示例 3:
输入: 218
输出: false
方法一:暴力判断法。
class Solution {
public:
bool isPowerOfTwo(int n) {
while (n != 1) {
if (n == 0 || n % 2 == 1) {//两种特例
return false;
}
n /= 2;//倍减
}
return true;
}
};
方法二:暴力递归法(上面的方法改写为递归)。
class Solution {
public:
bool isPowerOfTwo(int n) {
if (n == 1) {
return true;
}
else if (n == 0 || n % 2 == 1) {//如果是零、奇数
return false;
}
else {
return isPowerOfTwo(n / 2);//否则继续判断
}
}
};
方法三:不难发现,如果一个数是2的次幂,那么这个数的二进制必定形如“10000”,“100”,“10000000”。那么n&(n - 1)== 0
class Solution {
public:
bool isPowerOfTwo(int n) {
if (n <= 0) {//如果n小于等于零必定不是2的次幂
return false;
}
return (n & (n - 1)) == 0;
}
};