如何在java中将负双值转换为二进制值?

时间:2012-08-08 06:26:07

标签: java

以下是双值

-1.2316741412499997E8

以下是我使用的方法:

Long.toBinaryString(Double.doubleToRawLongBits(-1.2316741412499997E8))
output: 1100000110011101010111011000101011011000011111111111111111111110

然而,当我尝试使用值2时,我得到以下输出,如下所示,这是错误的。

Long.toBinaryString(Double.doubleToRawLongBits(2.0))
output: 100000000000000000000000000000000000000000000000000000000000000

有人会告诉我如何将负双值转换为二进制。谢谢。

3 个答案:

答案 0 :(得分:5)

我不确定你想要什么结果,但是result for 2.0 is absolutely correct

请注意,它给出的数字不是零填充,因此它似乎设置了符号位,但位设置是指数的最高位。

答案 1 :(得分:4)

浮点值(例如double)表示与整数值完全不同。从整数值开始,您习惯将它们表示为零填充(对于正数)二进制数,表示基数2中的相同数字。对于浮点值,这不适用。

根据定义,浮点值具有浮动小数点,因此二进制数必须对小数点所在的信息进行编码。这是通过将数字重新整理为以下内容来完成的:

(+/-) x * 2^y   whereas 0 <= x < 2 (= 10 base 2)

(+/-)是需要一点的标志。 x是尾数,y是指数。所以二进制表示最后必须编码三个部分。

0 <= x < 2开始,x始终以1.something开头,因此1.不需要在表示中。只保存小数点后的部分,这被认为是有效数字。

在您的示例中,2.0被重新整形为:

+ 1.0 * 2 ^ 1

签名:+ 显着性:0 指数:1

这恰好表示为

0 10000000000 0000000000000000000000000000000000000000000000000000

对于负数,符号为 - 表示为前导1

1 10000000000 0000000000000000000000000000000000000000000000000000

请注意,您的原始帖子会列出一个缺少前导0的数字,该数字在数学上是正确的,但在您尝试捕获二进制表示时会产生误导:

  10000000000 0000000000000000000000000000000000000000000000000000 =
0 10000000000 0000000000000000000000000000000000000000000000000000

还有一些细节需要了解并牢记在心。例如,指数也可以是负数。您可以在Floating Point Wikipedia article中找到更详细的说明。 joachim引用的binaryconvert.com也可以帮助您理解表示。

答案 2 :(得分:0)

这是你想要的吗?

System.out.println(Long.toBinaryString(Double.valueOf(2.0).longValue()));
System.out.println(Long.toBinaryString(Double.valueOf(-2.0).longValue()));