Re:将Double转换为byte []数组

时间:2013-11-24 15:52:48

标签: java type-conversion double byte


参考(Double to byte[])它包含我需要的问题和解决方案。

private byte[] convert(Double d) {
    byte[] output = new byte[8];
    Long lng = Double.doubleToLongBits(d);
    for (int i = 0; i < 8; i++) {
        output[i] = (byte)((lng >> ((7 - i) * 8)) & 0xff);
    }
    return output;
}

但我不知道它是如何工作的,为什么它工作,我理解循环是将组成Double的8个字节中的每一个分配给数组。但我不明白字节是如何构造的。有人可以向我解释下面的表达吗?

 ((lng >> ((7 - i) * 8)) & 0xff);

为什么Double.doubleToLongBits(d);会介入?

3 个答案:

答案 0 :(得分:2)

让我们分解这个表达:

((lng >> ((7 - i) * 8)) & 0xff);

一步一步。 ((7 - i) * 8)应该是显而易见的。 >>是二元右移运算符。它通过右操作数将左操作数旋转,从左侧填充MSB。因此,lng在每次迭代时旋转(7-i)个字节数。

&是按位AND运算符,这意味着如果两个操作数的位相同位置为1,则得到1,否则为0.因此,基本上与0xff进行AND运算给我们旋转lng的最后一个字节。

总而言之,从每次迭代中最重要的字节开始,每个字节都得到lng

要回答你问题的第二部分,请尝试直接旋转double值的位(你会得到一个讨厌的错误)。在Java中,double和long使用相同数量的字节(8),因此如果要执行按位运算,则必须先将double值转换为long。

答案 1 :(得分:0)

我们的想法是将一个整数值向右移动(这是右移运算符&gt;&gt;)然后用(& 0xff)取最后8位。

例如,如果您想要长n

右侧的第3个字节
(n >> (2*8)) & 0xff

需要doubleToLongBits,因为您不能移动浮点值的位,只能移位整数值。因此,这种方法只能为您提供双倍长值的位模式。

答案 2 :(得分:0)

Double#doubleToLongBitsIEEE 754格式创建值的64位表示。

循环从最高有效位开始占用所有64位,并将它们存储在一个8字节的数组中。

lng = 0x123456789abcdef0

(byte)((lng >> ((7 - 0) * 8)) & 0xff) == (byte) 0x12
(byte)((lng >> ((7 - 1) * 8)) & 0xff) == (byte) 0x34
(byte)((lng >> ((7 - 2) * 8)) & 0xff) == (byte) 0x56
(byte)((lng >> ((7 - 3) * 8)) & 0xff) == (byte) 0x78
(byte)((lng >> ((7 - 4) * 8)) & 0xff) == (byte) 0x9a
(byte)((lng >> ((7 - 5) * 8)) & 0xff) == (byte) 0xbc
(byte)((lng >> ((7 - 6) * 8)) & 0xff) == (byte) 0xde
(byte)((lng >> ((7 - 7) * 8)) & 0xff) == (byte) 0xf0