Java負整數的左移、右移、無符號右移。正數的位移沒有涉及到符號,而且正數的原碼、反碼、補碼都是一樣的,所以相對簡單,但是對於負整數的位移,往往容易混淆。
Java的<< >> >>> 都是針對補碼來進行的,因為Java只存儲補碼。
例如對整數-3進行<< >> >>>運算做說明。
整數-3的二進制
原碼為 10000000 00000000 00000000 00000011
反碼為 11111111 11111111 11111111 11111100
補碼為 11111111 11111111 11111111 11111101
Java存儲的整數-3即為11111111 11111111 11111111 11111101,
1、
對-3左移3位 -3<<3
<< >> 都是要關照符號位的,所以
11111111 11111111 11111111 11111101 左移3位后為
11111111 11111111 11111111 11101000 ,
原碼為:10000000 00000000 00000000 00100111,轉為整數即-24
2、
對-3右移3位 -3>>3 ,
就是對-3的補碼11111111 11111111 11111111 11111101右移3位,結果為:
1 111 1111111 11111111 11111111 11111,由於是負數,高位需要補1(正數高位補0),而
1 111 1111111 11111111 11111111 11111
的原碼為10000000 00000000 00000000 00000001,結果為-1,所以-3>>3的結果整數值為-1
3、
對-3進行無符號右移, -3>>>3,由於>>>是不顧符號的,高位全部補0,
11111111 11111111 11111111 11111101 無符號右移3位為
000 11111111 11111111 11111111 11111
由於無符號右移之后為正數,正數的補碼和原碼是一致的,所以 -3>>>3的值即為
000 11111111 11111111 11111111 11111
的值,變成整數輸出為:0*2^31+0*2^30+0*2^29+1*2^28+1*2^27+.....+1*2^1+1*2^0=536870911
原文地址:https://www.cnblogs.com/sunjie-one/p/8818901.html