移位運算分爲邏輯左移、邏輯右移、算術左移、算術右移
java
顧名思義:算術是有正負的。所以算術移位,關心符號位;而邏輯無論符號位。spa
1 算術左移(<<)
code
計算規則:按二進制形式把全部的數字向左移動對應的位數,高位移出(捨棄),低位的空位補零。 內存
結果:在數字沒有溢出的前提下,對於正數和負數,左移一位都至關於乘以2的1次方,左移n位就至關於乘以2的n次方。class
2 算術右移(>>)二進制
計算規則:按二進制形式把全部的數字向右移動對應的位數,低位移出(捨棄),高位的空位補符號位,即正數補零,負數補1。總結
結果: 對於正數,右移一位至關於除2,右移n位至關於除以2的n次方,餘數捨棄;直至0.數據
對於負數,右移一位至關於除2,右移n位至關於除以2的n次方,餘數捨棄;再加上-1。 即無論移動多少位,最小值爲-1.static
爲何是-1?由於高位補符號位,而0xFFFF 爲-1.移動
public static void main(String[] args) { System.out.println(new _02_位運算().isBigEndian()); System.out.println((-15)>>1);//-8 System.out.println((-15)>>2);//-4 System.out.println((-15)>>3);//-2 System.out.println((-15)>>4);//-1 System.out.println((-15)>>5);//-1 oxFFFF }
3 邏輯左移
即不關心符號位,低位補0.效果同算術左移是同樣的,所以也就沒定義新的符號。
4 邏輯右移(>>>)
即無符號右移。
規則:按二進制形式把全部的數字向右移動對應位數,低位移出(捨棄),高位的空位補零。
結果:對於正數,結果同算術右移是同樣的。
對於負數,由於高位補0,結果就沒有特定的規律,沒有規律也就喪失了意義。
總結:右移,對於正數,由於高位補0,>> >>>結果都同樣。
左移,對於正數、負數,都是低位補0,結果都同樣。
問題:大小端對移位運算有沒有影響?
大小端是內存存儲數據高位和數據低位的不一樣順序;而移位移的是寄存器中的內存,與內存是無關的。