2的幂
题目:给定一个整数,编写一个函数来判断它是否是 2 的幂次方。
思路:一个数是2的次方那么它32位上只能有一个1,其他都是0
方法1:通过将这个数与1进行&运算,判断1的个数是否是1.
class Solution {
public:
bool isPowerOfTwo(int n) {
int t = n;
int ones = 0;
while(t > 0){
ones += (t & 1);
t >>= 1;
}
return ones == 1;
}
};
方法2:
利用n&(n-1)判断是否为0,如果是0则为2的幂
class Solution {
public:
bool isPowerOfTwo(int n) {
// int t = n;
// int ones = 0;
// while(t > 0){
// ones += (t & 1);
// t >>= 1;
//}
//return ones == 1;
if(n == 1)
{
return true;
}
else if(n > 1)
{
return ((n%2) == 0) && isPowerOfTwo(n/2);
}
else
{
return false;
}
}
};
3的幂
和判断2的幂的方法一样。
class Solution
{
public:
bool isPowerOfThree(int n)
{
if(n <= 0)
return false;
else if(n == 1)
return true;
else
return n % 3 == 0 && isPowerOfThree(n / 3);
}
};
4的幂(按照题目要求,不能使用循环或者迭代)
题目:给定一个整数 (32 位有符号整数),请编写一个函数来判断它是否是 4 的幂次方。你能不使用循环或者递归来完成本题吗?
思路:一个数是4的幂一定是2的幂,但是一个数是2的幂不一定是4的幂。如下图所示,上下两幅图加起来就是2的幂,但是4的幂只在基位,因此可以通过与奇数位都是1,偶数为都是0的数(1010101010101010101010101010101)进行与运算,结果仍为原来数。
class Solution {
public:
bool isPowerOfFour(int num) {
return num > 0 && !(num & num - 1) && (num & 0x55555555) == num;
}
};