Java軟件低級錯誤(十二):Java的移位(>>和>>>)運算問題

 解讀

   運算符>>指的是對它左邊的操作數帶符號右移位。我們知道數據的補碼錶示,如果是負數,那麼它的最高位是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)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章