一、题目介绍
给定一个整数 (32 位有符号整数),请编写一个函数来判断它是否是 4 的幂次方。
示例 1:
输入: 16
输出: true
示例 2:
输入: 5
输出: false
进阶:
你能不使用循环或者递归来完成本题吗?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/power-of-four
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、解题思路
方法有很多种,本文给出了一种常规方法,可以直接看代码很容易理解,这里不做赘述。下面介绍一种不用递归和迭代的求解方法。
(1)首先我们知道2的幂满足:x > 0 and x & (x - 1) == 0。且4的幂一定是2的幂,反之则不然。
(2)其次不难发现,2的偶数次幂同为4的幂,而2的奇数次幂则不是4的幂。在这两种情况中,都只有一位为1,其余位为0.
(3)在偶数次幂的情况中,1处于二进制中偶数的位置:第0位、第2位、第4位等;在奇数次幂的情况中,1处于奇数位置。因此如果x满足2的幂的同时,满足:x & 10101010 10101010 10101010 10101010 == 0,则为4的幂。用十六进制表示则为x & aaaaaaaa == 0。
三、解题代码
//常规方法
class Solution {
public:
bool isPowerOfFour(int num) {
if(num == 1)
return true;
while(num >= 4 && num % 4 == 0)
{
num /= 4;
}
return num == 1;
}
};
//位运算方法
class Solution {
public:
bool isPowerOfFour(int num) {
return num > 0 && (num & (num-1)) == 0 && (num & 0xaaaaaaaa) == 0;
}
};