其實電腦中的數值用補碼來表示,主要目的一是防止0有兩種編碼,二是將減法用加法表示方面電路設計,或者說電路只能進行加法運算,所以把負數變成補碼後就相當於加法運算。正數的補碼和它的源碼相同,負數的補碼則不同。所以對於移位而言,如果是負數,從我們的角度來看,應該是先寫出這個負數的正數對應的補碼,即為該負數的值,然後進行移位;移位的結果中,如果高位為0表示這個移位後的結果為正數;反之為負數,這時可以求它的補碼來求得該負數的值,具體可以見下面的例子。
這裡介紹下移位的原理,<<表示左移,和符號沒有關係,>>和>>>表示有符號右移和無符號右移,具體操作如下。
>>:int a = -2; int b = (a>>2);結果b為-1,過程為:
2對應的二進位位(由於int為4位元組)0000 0000 ......00000010
所以-2對應的二進位為:對2的二進位先求補碼1111 1111 ......11111110
右移兩位,高位補1,得到1111 1111 ......1111 1111由於高位為1,所以這是個負數,負數的值可以通過對此求補碼來看到,補碼為0000 0000 ...... 0000 0001,所以移位後的結果為-1。
>>>:int a = -2;
int b = (a>>2);結果b為1073741823,過程為:
2對應的二進位位(由於int為4位元組)0000 0000 ......00000010
所以-2對應的二進位為:對2的二進位先求補碼1111 1111 ......11111110
右移兩位,高位補0,得到0011 1111 ......1111 1111由於高位為0,所以移位的結果為正數,即這就是結果,這個結果0011 1111 ...... 1111 1111對應的十進位就是1073741823。
<<:int a = -2;
int b = (a>>2);結果b為,過程為:
2對應的二進位位(由於int為4位元組)0000 0000 ......00000010
所以-2對應的二進位為:對2的二進位先求補碼1111 1111 ......11111110
左移兩位,低位補0,得到1111 1111 ...... 1111 1000,由於高位為1,所以這個移位的結果為負數,對此求補碼,就可以知道這個負數的值,補碼為0000 0000 ...... 0000 1000,補碼的結果為8,所以對應的負數為-8。
另外,需要注意的是,對於如下代碼
int i=-1;
int j=i>>>35;
java在啟動並執行時候是這樣的:由於int是4位元組32位的,所以在進行移位時實際是取的移位元35的模,即35mod32為3,相當於移位了3位,而不是移動了35位,這一點要格外注意。
還有就是java在對char byte short進行移位的時候,在移位前,會將他們自動轉成int型,然後在進行移位。注意,轉成了int和不轉成int的移位效果有時候區別是很大。而且在java中會提示我們有錯誤,如所示