描述 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?

[Power of Four]

分析 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);
    }
}

results matching ""

    No results matching ""