Java負整數的左移、右移、無符號右移


轉自  Java負整數的左移、右移、無符號右移

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM