位移運算符用來將操作數向某個方向(向左或者右)移動指定的二進制位數。在Java中,位移運算分為左位移和右位移,符號為<<和>>。
左位移運算符
左位移的符號是<<,其運算規則是:按二進制形式把所有的數字向左移動對應的位數,高位移出(舍棄),低位的空位補零。
例如,將整數 11 向左位移 1 位的過程如圖所示:
從圖中可以看到,原來數的所有二進制位都向左移動 1 位。原來位於左邊的最高位 0 被移出舍棄,再向尾部追加 0 補位。最終到的結果是 22,相當於原來數的 2 倍。
對於正數的左位移,向左位移幾次,就乘以2的幾次方。比如5向左位移3次,表示為:5<<3,結果為5乘以2的三次方,等於30。
右位移運算符
右位移的符號是>>,其運算規則是:按二進制形式把所有的數字向右移動對應的位數,低位移出(舍棄),高位的空位補零。
例如,將整數 11 向右位移 1 位的過程如圖所示:
從圖中可以看到,原來數的所有二進制位都向右移動 1 位。原來位於右邊的最低位 1 被移出舍棄,再向最高位追加 0 補位。最終到的結果是 5,相當於原數整除 2 的結果。
對於正數的右位移,向右移動幾次,就除以2的幾次方。比如5向右位移一次,表示為5>>1,結果為5除以2,等於2。
總結
對於負數來說,Java中的位移應該謹慎使用,因為位移運算在Java中稱為帶符號的位移。位移時需計算其原碼、反碼、補碼,得到結果后,還要對結果計算反碼、原碼,性能還不如直接使用乘除法。所以,如果是正數,當可以使用位移運算時可以盡量使用,能提升性能,而對於負數來說,還是盡量別用吧,結果與除法相差太遠。