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