我不确定如何检查双精度是否是2的幂。这是我的代码到目前为止:
double x = Double.longBitsToDouble(
Double.doubleToRawLongBits(n) & Double.doubleToRawLongBits(n - 1)
);
我使用以下公式来查找数字是2的幂:
n & (n - 1) == 0
但它不起作用。
答案 0 :(得分:1)
要处理大数字,您可以使用BigInteger类:
public boolean isPowerOfTwo(BigInteger n) {
if (n.compareTo(BigInteger.ZERO) <= 0) {
return false;
}
return (n.and(n.subtract(BigInteger.ONE))).equals(BigInteger.ZERO);
}
答案 1 :(得分:1)
如果问题与非常大的数字有关,那么Oleksandr的答案会更好,但是如果你真的想检查double
是否是2的偶数幂,你可以检查一下尾数为零:
(Double.doubleToLongBits(n) & 0x000fffffffffffffL) == 0
为了更加健壮,您将要处理非标准化数字(无穷大,NaN,非正规数,并且可能决定零是否应该返回true)的边缘情况,但这些通常是边缘情况。 / p>
答案 2 :(得分:1)
这应该适用于所有情况,尽管无穷大是否被视为 2 的幂可能是特定于应用程序的。
public static boolean isPowerOfTwo(double val) {
if (val <= 0.0 || Double.isNaN(val))
return false; // You can't raise 2 to a power and get a negative number or zero.
if (Double.isInfinite(val))
return false; // Arguable assumption. val is bigger than MAX_VALUE but we don't really know if it's a power of 2 or not.
long significand = Double.doubleToLongBits(val) & 0x000f_ffff_ffff_ffffL;
if (val >= Double.MIN_NORMAL)
return significand==0; // only the hidden 1 remains
else
return (Long.bitCount(significand) == 1); // denormalized, no hidden one, power of two only if exactly one bit in significand is set
}