按位不适用于 Java 中的 double

Bitwise Not for double in Java

在Java中,按位非运算符(~)反转整数或长整型的所有位。但是为什么这对于 double 是不可能的呢?有什么方法可以在 double 上使用这个操作吗?我正在用 Java 编写我自己的编程语言(这不是家庭作业),我认为双打应该包括按位。

有什么方法可以在双打上不按位使用吗?

编辑:这不是How to perform a bitwise operation on floating point numbers的副本,因为我使用的是Java而不是讨论的C。我也知道那里不可能使用该语言的语法,但那里的答案似乎将 double 转换为 int。我需要保持原样,而不将其更改为 intlong.

编辑:按位非不是我想的那样。它似乎对输入执行 *-1 - 1 。因此,我的问题现在变成:

我希望将双精度转换为二进制(参见我的另一个问题 ),反转所有位(0 到 1 和 1 到 0),然后将其转换回双精度。

您可以使用 Double 并使用 doubleToRawLongBits 转换它,然后使用您想要的任何按位运算符。

但是,我不知道这意味着什么 :$ 但它肯定会起作用...这是您需要的吗?

Java 没有在浮点类型 floatdouble 上提供 ~ 运算符,因为这样的操作没有意义。

可以用这个方法模拟:

public static double performNotOnDouble(double d)
{
    return Double.longBitsToDouble(~Double.doubleToLongBits(d));
}

但结果没有任何实际意义:

0.0: NaN
1.0: -3.9999999999999996
10.0: -0.43749999999999994
-1.0: 3.9999999999999996
0.01: -440.31999999999994
3.141592653589793: -1.4292036732051032
2.718281828459045: -1.6408590857704772
Infinity: -2.225073858507201E-308
-Infinity: 2.225073858507201E-308
NaN: -1.1125369292536E-308

浮点类型的位补没有意义,因为结果没有任何意义。

您确实需要阅读有关 IEEE 754 before considering this sort of operation, and this part of the JLS spec 的内容。

The inverse of 0 should be 1. 0 is 0b0, and the inverse of that is 0b1. Also, using long bits results in NaN most of the time.

虽然0.0d确实是0b0,但0b1肯定不是0.0d的按位逆。

  • Double.doubleToLongBits(0.0d)) = 0
  • Double.doubleToLongBits(1.0d) = 4607182418800017408
  • Double.longBitsToDouble(0b1) = 4.9E-324

一般来说,考虑到一些不精确性,每个 double 值实际上代表围绕您能够打印出的值的一系列值。

您还应该检查 "How to resolve a Java Rounding Double issue"(可能还有一些 link 的问题)。

该上下文中的位运算通常毫无意义。

(沿着这些思路,您可以阅读一些关于 strictfp 的知识,以获得一般 Java 知识。)