2013-11-26 104 views
0

我想了解下面的代碼。「&0xFF」和「>>>」位移做了什麼?

getKey()方法返回一個字符串,getDistance()返回一個double。代碼是從一個類中取得的,該類用於存放String(鍵)和Double(距離)對。

更具體地說,我不確定做什麼換行的線。

public void serialize (byte[] outputArray) { 

    // write the length of the string out 
    byte[] data = getKey().getBytes(); 
    for (int i = 0; i < 2; i++) { 
     outputArray[i] = (byte) ((data.length >>> ((1 - i) * 8)) & 0xFF); 
    } 

    // write the key out 
    for (int i = 0; i < data.length; i++) { 
     outputArray[i + 2] = data[i]; 
    } 

    // now write the distance out 
    long bits = Double.doubleToLongBits (getDistance()); 
    for (int i = 0; i < 8; i++) { 
     outputArray[i + 2 + data.length] = (byte) ((bits >>> ((7 - i) * 8)) & 0xFF); 
    } 
} 

任何幫助將不勝感激。

+4

辛辣的細節:它是位移,不是字節移位。你看過這些文檔,看看這些運營商在做什麼? –

+0

那麼......因爲它的位移是8的倍數,所以他實際上正在移位字節 –

回答

2

首先閱讀Java的tutorial位運算符。總之:

>>>是一個無符號右移

& 0xFF是取與的(bits >>> ((7 - i) * 8))0xFF

2

>>>結果是無符號的右移操作。它也會移動符號位。

& 0xFF保留位以產生8位(字節)值,否則可能會有一些垃圾。

+0

而且你沒有得到一些垃圾,你得到一個*符號擴展值*。 – Durandal

+0

@Durandal:確實,這是一個有效的,很好的價值。在最終值的視圖中的垃圾值。 – deepmax

+0

但是,如果您查看第一個for循環中發生的移位不是和&運算符多餘?輸出數組[i] =(byte)((data.length >>>((1-i)* 8))&0xFF); 0xFF是255或1111111,因爲循環,(1 - i)* 8可以是0或8. 0&0xFF是0和8&0xFF是8. 另外我猜我沒有我自己在問題中正確,我想問的是上面代碼的「重點」是什麼。爲什麼第一個循環被註釋爲「//寫出字符串的長度」 - 這與存儲長度有什麼關係?爲什麼不把它存儲在outputArray [1]中? –