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.
判断一个数是否是4的幂次。
2,题目思路
用常规的幂次判断方法是不行的,比如:
return (int)pow(4,15)%num == 0;
虽然这种办法对于2,3等数字是有效的,但是4是2的幂次,因此32在这种条件下是满足所谓4的幂次的(实际并不是)。因此需要另外一种方法。
个人想到的一个方法,就是对4的幂次的二进制形式进行分析。经过分析可以看出,
4 :100
16 :10000
64 : 1000000
对于num,如果num是4的幂次,首先它一定是2的幂次,其次,num-1的二进制形式的1的个数为偶数。
用到了bitset
办法来操作。
另外一种方法,则是首先判断num是否是2的幂次,再判断num-1是否是3的倍数即可。
3,程序源码
1:
class Solution {
public:
bool isPowerOfFour(int num) {
return (num > 0 && bitset<32>(num-1).count()%2 == 0 && !(num&(num-1)));
}
};
2,
bool isPowerOfFour(int num) {
return num > 0 && (num & (num - 1)) == 0 && (num - 1) % 3 == 0;
}