天天看點

Java中負數的右移

我們知道,在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