我們知道,在Java中常用的位移運算有三種,分別是:<<(左移)、>>(帶符號右移)和>>>(無符號右移)。
這一次,我們來看一下其中的帶符號右移運算符>>
在負數計算時的效果。
首先,是一段測試代碼:
public static void main(String[] args) {
int num = -10;
System.out.println(num >> 1);
System.out.println(num >> 2);
}
讀者可以先思考一下輸出為多少?輸出:
-5
-3
看到這個結果,可能讀者就有點疑問了,一般來說,左移右移不是相當於乘以2或者除以2么,為什么這里會出現-3呢?
我們首先需要明確的是,>>
運算符叫做帶符號右移,也即為其在運算時的規則為在要處理的數字的左端補一個等於符號位的數字,即為正數補0,負數補1。可以記為:符號位不變,左邊補上符號位。
下面一個問題就是,這個運算符所操作的對象是什么呢?可能第一反應是:不就是左邊的這個數么?這么說當然沒有問題,但是計算機中存儲的數字並不是直觀上我們看到的這個數,計算機中所存儲和操作的是數字的補碼,如果是正數的話,就不用考慮這么多,但是如果是負數的話,就要注意了。
這里,筆者用8位的數字來說明一下為什么’-5 >> 1 = -3`。
首先,我們看一下-5的形式:
源碼:1000 0101
反碼:1111 1010
補碼:1111 1011
左移一位之后:
補碼:1111 1101
反碼:1111 1100
原碼:1000 0011
那么現在看一下,結果-3已經出現了。
因此,在遇到負數的位移運算的時候,寫代碼之前還是要好好考慮一下的。