Java基礎之移位運算,爲什麼高位補1?

首先,瞭解原碼、反碼、補碼:

原碼:

使用高位作爲符號位。最高位爲0時表示正數,最高位爲1時則表示爲負數。其餘位使用此數字數值本身二進制的絕對值表示。

反碼:

使用高位作爲符號位。最高位爲0時表示正數,最高位爲1時則表示爲負數。正數的反碼還是正數本身;負數的補碼即在原碼的基礎上,符號位不變,其他位取反。

補碼:

使用高位作爲符號位。最高位爲0時表示正數,最高位爲1時則表示爲負數。正數的補碼就是正數本身,負數的補碼就是其原碼取反加一。

下面舉例:

正數/負數 原碼 反碼 補碼
13 0000 1101 0000 1101 0000 1101
-13 1000 1101 1111 0010 1111 0011

右移(>>):

右移即帶符號右移。對於正數的右移,移位過程中、高位補零;對於負數的右移,因爲負數在內存中是以補碼形式存在的,所有首先根據負數的原碼求出負數的補碼然後保證符號位不變,其餘位向右移動到X位,在移動的過程中,高位補1.等移位完成以後,然後保持符號位不變,其餘按位取反加1,得到移位後所對應數的原碼。即爲所求。

無符號右移(>>>):

對於正數的帶符號右移,不論正數還是負數,移位過程中高位均補零。

舉例:

正數右移和無符號右移是都是高位補零

原數字 原碼(二進制數) (無符號)右移/4位 結果
60 0011 1101 0000 0011 3

負數右移

原數字 原碼(二進制數) 補碼 右移4位 轉換成原碼 結果
-60 10000000 00000000 00000000 00111101 11111111 11111111 11111111 11000011 11111111 11111111 11111111 11111100 10000000 00000000 00000000 00000100 -4

負數無符號右移

原數字 原碼(二進制數) 補碼 無符號右移4位 結果
-60 10000000 00000000 00000000 00111101 11111111 11111111 11111111 11000011 00001111 11111111 11111111 11111100 268435452

由於負數是以補碼的形式保存,因此帶符號右移時>>,高位依次爲1,才能保證轉換成原碼後值不變!

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