在Java中,按位非运算符(~
)反转整数或长整数位。但为什么double
无法做到这一点?有没有在double
上使用此操作的方法?我正在用Java编写自己的编程语言(这不是一个家庭作业),我相信按位也应包含双精度。
任何使用按位而不是双打的方式?
编辑:这不是How to perform a bitwise operation on floating point numbers的副本,因为我使用Java而不是讨论的C.我也知道没有可能使用的语法语言,但那里的答案似乎将double
强加给int
。我需要保持双倍,而不是将其更改为int
或long
。
编辑:按位并不是我想的那样。它似乎在输入上执行*-1 - 1
。因此,我的问题现在变成:
我希望将double转换为二进制(请参阅我的另一个问题),将所有位(0到1和1都反转为0),然后将其转换回double。
答案 0 :(得分:6)
Java没有为浮点类型~
和float
提供double
运算符,因为这样的操作没有意义。
您可以使用此方法进行模拟:
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
没有必要采用浮点类型的位补码,因为结果没有任何意义。
答案 1 :(得分:1)
您可以使用Double并使用doubleToRawLongBits转换它,然后使用您想要的任何按位运算符。
但是,我不知道这意味着什么:$但肯定会有用......这就是你需要的吗?
答案 2 :(得分:1)
在考虑此类操作之前,您确实需要阅读IEEE 754和this part of the JLS spec。
0的倒数应该是1. 0是0b0,并且它的倒数是0b1。此外,使用长位会在大多数情况下产生NaN。
虽然0.0d
确实是0b0
,但0b1
肯定不是0.0d
的按位反转。
Double.doubleToLongBits(0.0d))
= 0
Double.doubleToLongBits(1.0d)
= 4607182418800017408
Double.longBitsToDouble(0b1)
= 4.9E-324
一般来说,考虑到一些不精确的情况,每个双值实际上代表了你能够打印出的值的一系列值。
您还应该检查"How to resolve a Java Rounding Double issue"(以及可能链接到它的一些问题)。
在该上下文中的按位操作通常是没有意义的。
(沿着这些方面,您可以阅读一些关于strictfp
的一般Java知识。)