1.题目
Given an integer (signed 32 bits), write a function to check whether it is a power of 4.
Example:
Given num = 16, return true. Given num = 5, return false.
给一个整数n,判断是否为4的幂
2.分析
之前已经做过了判断3的幂次方,2的幂次方。
求int32范围内最大的2的幂次方,3的幂次方,通过整除来判断的方法只适用于2和3这样的质数。
由于2的特殊性,所以可以通过bit位为1来判断。
4也很特殊。
1)4=2*2。所以对n开方,然后判断是否为2的幂次方也是可行的。
2)从bit位来看4的幂次方如1=0001,4=0100,16=0001,0000,64=0100,0000.
可以看到bit为1的位总是在每4位的0或3号位上。所以可以先判断n是否为2的幂,再判断是够满足为4的幂。
3.代码
public:
//开方
bool isPowerOfFour_1(int num) {
if (num <= 0)
return false;
if (num == 1)
return true;
auto x = sqrt(num);
if (fmod(x, 1) == 0 && !(int(x)&(int(x) - 1)))
return true;
return false;
}
//log
bool isPowerOfFour_2(int num) {
return fmod(log10(num)/log10(4),1)==0;
}
//bit判断
bool isPowerOfFour_3(int n) {
return n > 0 && (n&(n - 1)) == 0 && (n & 0x55555555);
}
};