2013-11-24 58 views
1


参照(Double to byte[])它包含了我需要的问题和解决方案。回复:将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); 
    } 
    return output; 
} 

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

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

和为什么Double.doubleToLongBits(d);卷入?

+0

你问运营商做什么? –

回答

2

让我们打破这个表达式:

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

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

&是按位与运算,这意味着,如果你在两个操作数同位的位置有一个1,你会得到一个1,否则为0。所以,基本上取与与0xff基本上给我们的最后一个字节旋转lng

把它放在一起,你得到从每个迭代中最重要的字节开始的每个字节lng

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

+0

不,>>填写MSB的值。使用>>>如果你想要0。 – Ingo

+0

@Ingo - 我站好了! – Chandranshu

+0

'* 8'因为8位字节。 '7-i'因为我们想要关注的字节位置。 '>>'通过((7-1)* 8)位数来旋转长度。 '&0xff'因为255是一个字节的最大值,最后一个字节之间的“重叠”是我想要的。 是否正确? –

0

这个想法是将积分值向右移(这是右移运算符>>),然后取最后的8位与(& 0xff)

例如,如果你想从长n

(n >> (2*8)) & 0xff 

,因为你不能在位移位只的整数值浮点值,需要的doubleToLongBits右侧的第三个字节。因此,这种方法只是给你一个双倍长的值的位模式。

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 
相关问题