检查双倍是否是力量2

时间:2017-03-25 17:33:33

标签: java

我不确定如何检查双精度是否是2的幂。这是我的代码到目前为止:

double x = Double.longBitsToDouble(
    Double.doubleToRawLongBits(n) & Double.doubleToRawLongBits(n - 1)
);

我使用以下公式来查找数字是2的幂:

n & (n - 1) == 0

但它不起作用。

3 个答案:

答案 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
}