问题:检查数字是否为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的东西? 感谢。
答案 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;
}
答案 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需要截断它以适应它的宽度。