2013-11-24 59 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 
相關問題