大小端和移位運算

移位運算分爲邏輯左移、邏輯右移、算術左移、算術右移
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,結果都同樣。

問題:大小端對移位運算有沒有影響?

      大小端是內存存儲數據高位和數據低位的不一樣順序;而移位移的是寄存器中的內存,與內存是無關的。

相關文章
相關標籤/搜索