Java Re:将双精度转换为字节[]数组

Java Re:将双精度转换为字节[]数组,java,type-conversion,double,byte,Java,Type Conversion,Double,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); } ret


关于()它包含了我需要的问题和解决方案

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;
}

为什么要参与其中呢?

让我们来分解一下这个表达式:

((lng >> ((7 - i) * 8)) & 0xff);
一步一步<代码>((7-i)*8)应该是显而易见的
>
是二进制右移运算符。它将其左操作数按右操作数从左侧填充MSB的位数进行旋转。因此,
lng
在每次迭代中旋转
(7-i)
字节数

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

要将所有这些放在一起,您可以从每次迭代中最重要的字节开始获得
lng
的每个字节


要回答问题的第二部分,请尝试直接旋转双精度值的位(您将得到一个严重错误)。在Java中,double和long使用相同数量的字节(8),因此如果要执行逐位操作,必须首先将double值转换为long。

方法是将整数值向右移位(这是右移位运算符>>),然后使用
(&0xff)
获取最后8位

例如,如果您想要从长
n

(n >> (2*8)) & 0xff
需要
doubleToLongBits
,因为您不能移位浮点值的位,只能移位整数值的位。因此,此方法只提供了一个double as long值的位模式。

double#double tolongbits以格式创建值的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

是否询问运算符的作用?否,>>将填充MSB的值。如果需要0,请使用>>>。
*8
,因为字节为8位
7-i
因为我们要关注的字节位置<代码>>将长循环旋转((7-1)*8)个位位置
&0xff
因为255是一个字节的最大值,最后一个字节之间的“重叠”是我想要的。正确?除此之外,所有选项都正确:
&0xff
,因为它都是一。255是
0x7f
-第一位为0,其余为1。
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