确定数字是4的幂,logNum%logBase == 0 vs(logNum / logBase)%1 == 0

时间:2016-04-19 21:48:48

标签: java algorithm

问题:检查数字是否为4的幂。

我在java中的解决方案:

public static boolean isPowerOfFour(int num) {
    return (Math.log(num) % Math.log(4) == 0);
}

但在某些情况下似乎没有,例如当num为64时。

我发现如果我稍微更改一下代码,它就会运行良好。

public static boolean isPowerOfFour(int num) {
    return (Math.log(num) / Math.log(4) %1 == 0);
}

我认为两个解决方案都做同样的事情,检查logNum / logBase的剩余部分是否为0.但是为什么第一个解决方案不起作用?是因为解决方案不正确还是相对于某些低级JVM的东西? 感谢。

4 个答案:

答案 0 :(得分:4)

在@ dasblinkenlight的答案基础上,您可以轻松地将两个条件(首先是2的幂,然后是4的所有可能幂中的4的幂)与一个简单的掩码结合起来:

public static boolean isPowerOfFour(int num) {
  return ((( num & ( num - 1 )) == 0 )    // check whether num is a power of 2
      &&  (( num & 0xaaaaaaaa ) == 0 ));  // make sure it's an even power of 2
}

没有循环,没有转换为浮动。

答案 1 :(得分:1)

检查数字是4的幂是否与检查数字的偶数幂是否相同。

您可以通过验证x为零(here is the explanation of how this works

来检查数字x & (x-1)是2的幂。

如果您的号码的权力为2,请返回false。否则,将数字向右移动直至到达一个,并计算轮班数。如果您移动了奇数次,请返回false;否则,请返回true

public static boolean isPowerOfFour(int num) {
    if ((num & (num-1)) != 0) {
        return false;
    }
    int count = 0;
    while (num != 1) {
        num >>= 1;
        count++;
    }
    return count % 2 == 0;
}

Demo.

答案 2 :(得分:0)

Math.log之类的函数返回带有舍入误差的浮点数。因此,当num = 64时,Math.log(num)/ Math.log(4)不完全是3,而是接近3的数字。

public static boolean isPowerOfFour(int num) {
    if (num > 0) {
        while (num % 4 == 0) num /= 4;
    }
    return (num == 1);
}

这个解决方案很容易适应,以检查num是否是大于1的其他整数的幂。

答案 3 :(得分:0)

它不起作用的原因是因为Math.log()返回一个double。 false的答案反映了舍入误差; log(64)base e是一个无理数,但Java需要截断它以适应它的宽度。