運算符>>指的是對它左邊的操作數帶符號右移位。我們知道數據的補碼錶示,如果是負數,那麼它的最高位是1,所以右移位操作時左邊的空缺用1填補。
運算符>>>也是右移,但它與>>的區別是對於負數,右移不是用1填補,而是用0填補。也就是>>>不考慮數的正負,機械地移位就是了。
另外:>>>的左邊操作數如果是char,byte,short,運算前會先轉換成int,運算結果也就成了int,如果再對運算後的結果int強制類型轉換到byte,那它只會機械地截取數據的最右邊8位。
程序一
byte i = (byte)0xf3;//二進制:11110011
byte j = (byte)(i >>> 3);
System.out.printf("%x", j);
程序二
byte i = (byte)0xf3;//二進制:11110011
byte j = (byte)((i & 0xff) >>> 3);
System.out.printf("%x", j);
程序1的運行結果是:fe,也就是二進制:11111110( 0xf3轉換爲整型後會變成fffffff3,二進制爲11111111111111111111111111110011,移位3位後變成00011111111111111111111111111110,轉換爲byte,結果自然爲11111110 ),而不是預期的結果:1e,也就是二進制:00011110。
程序2中將操作數移位前與0xff作一次按位與運算後得到預期的結果(這裏0xff是整型,完整的寫法是0x000000ff,因此0xf3 & 0xff的結果爲000000f3,該值右移三位再轉換爲byte的值爲1e)。