引用( 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);
参与其中?
最佳答案
让我们分解一下这个表达式:
((lng >> ((7 - i) * 8)) & 0xff);
一步一步来。 ((7 - i) * 8)
应该是显而易见的。 >>
是二进制右移运算符。它将其左操作数旋转右操作数从左侧填充 MSB 的位数。因此,lng
在每次迭代中都会旋转 (7-i)
字节数。
&
是按位 AND 运算符,这意味着如果两个操作数的相同位位置上都有 1,则得到 1,否则得到 0。因此,基本上与 进行 AND 运算0xff
基本上为我们提供了旋转后的 lng
的最后一个字节。
将它们放在一起,您可以从每次迭代中的最高有效字节开始获取 lng
的每个字节。
要回答问题的第二部分,请尝试直接旋转 double 值的位(您将得到一个严重的错误)。在Java中,double和long使用相同的字节数(8),因此如果要执行按位运算,必须先将double值转换为long。
关于java - 回复 : Convert Double to byte[] array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20176528/