题目说明
给定一个整数,编写一个函数来判断它是否是 2 的幂次方。
示例 1:
输入: 1
输出: true
解释: 2 0 = 1 2^0=1 20=1
示例 2:
输入: 16
输出: true
解释: 2 4 = 16 2^4=16 24=16
示例 3:
输入: 218
输出: false
题目分析
一开始也是用最简单传统的思维,用while来一直对
n
n
n进行2除(代码1),但是执行到最后是超出时间限制的。然后用用同样的方法,但是用递归(代码2),便可以得到结果。
但其实网上更多的解决办法是利用位运算,所以这里总结出规律就是一旦涉及到数字的运算,便要考虑是否能使用与& / 或|。
(代码3)中利用到的就是下面的规律啦~
1: 1
2: 10
4: 100
8: 1000
16: 10000
…
显然,每一个符合2的幂的数的二进制都只有一个1,因此我们可以对二进制进行求和,最终结果为1,即证明它为2的幂。
这里还可以有另一种运算(代码4),也即将这个数n减去1,变成:
1-1: 0
2-1: 01
4-1: 011
8-1: 0111
16-1: 01111
…
然后再将它和原来的数进行 & 运算,如果是2的幂,则最终结果一般为0。
代码1
class Solution {
public:
bool isPowerOfTwo(int n) {
while(n%2 == 0) {
n /= 2;
}
if(n == 1)
return true;
else
return false;
}
};
代码2
class Solution {
public:
bool isPowerOfTwo(int n) {
if(n==1)
return true;
if(n >= 2 && n % 2==0) {
return isPowerOfTwo(n/2);
}
return false;
}
};
代码3
class Solution {
public:
bool isPowerOfTwo(int n) {
int sum=0;
while(n > 0) {
sum += (n&1);
n = n>>1;
}
if(sum == 1) {
return true;
} else {
return false;
}
}
};
代码4
class Solution {
public:
bool isPowerOfTwo(int n) {
if(n <= 0) return false;
else
return (n&(n-1)) == 0 ? true : false;
}
};