2013-11-26 28 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]中? –