一. 题目描述
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.
Follow up: Could you solve it without loops/recursion?
二. 题目分析
题目的大意是,给定一个32位有符号整数,编写函数,判断它是否是4的幂。
进一步思考:你可以不用循环/递归解决问题吗?
从Power of Two一题中我们知道,一个数为2的幂次方时,满足:该数的二进制表示,最高位为1,其余位为0。而4的幂次方包含在此命题中,所以也是符合该条件的。
但又不同于2的幂次方数,4的幂次方还有一个特性,就是其二进制表示中,0的个数为偶数,比如:
1: 1 0的个数为0个
4: 100 0的个数为2个
16:10000 0的个数为4个
64:1000000 0的个数为6个
若使用循环,则定义一个辅助变量temp,每次移位两次(temp << 2)与输入变量num进行判断;或者将num与10101010101010101010101010101010
(即0xaaaaaaaa
)相与,若num & 0xaaaaaaaa != 0
,表示num不为4的幂次方,此时返回false,否则返回true。
三. 示例代码
// C++,迭代版本
class Solution {
public:
bool isPowerOfFour(int num) {
long long temp = 1;
while (temp < INT_MAX && num >= temp)
{
if (num == temp) return true;
else if (num > temp) temp <<= 2;
}
return false;
}
};
// C++,位运算,无需迭代和递归
class Solution {
public:
bool isPowerOfFour(int num) {
if (num > 0 && (num & (num - 1)) == 0 && (num & 0xaaaaaaaa) == 0) return true;
else return false;
}
};
// 位运算的Python版本
class Solution(object):
def isPowerOfFour(self, num):
""" :type num: int :rtype: bool """
return num > 0 and num & (num - 1) == 0 and num & 0xaaaaaaaa == 0
四. 小结
该题是经典的位运算题目。