描述 Description
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?
分析 Analysis
4的整数次幂的二进制数都为 (4)100、(16)10000、(64)1000000......
除了通用方法外的方法
方法1
将4的幂次方写成二进制形式后,很容易就会发现有一个特点:二进制中只有一个1(1在奇数位置),并且1后面跟了偶数个0; 因此问题可以转化为判断1后面是否跟了偶数个0就可以了。
方法2
lz推荐。4的幂次方4^n也可以写为2^(2*n),即也可以写为2的幂次方,当然就满足2的幂次方的条件了,即num & num-1==0。
首先用条件num & num-1==0来判断是否为2的幂次方(其实是判断是不是只有一个1),若不满足,则不是。若满足,在用条件num & 0x55555555来判断bit位为1的是不是在偶数位上,若为真,则这个整数是4的幂次方,否则不是。
return num > 0 and (num & num - 1) == 0 and (num & 0x5555555555555555) != 0
或者return ((num-1)&num)==0 && (num-1)%3==0;
Note: 后一种是因为(3 + 1)^n; 如果是2^(2k+1)就不能%3=0了。
代码 Code
方法2
public class Solution {
public boolean isPowerOfFour(int num) {
return (num > 0) && ((num & (num - 1)) == 0) && ((num & 0x55555555) == num);
}
}