1. 程式人生 > >java按位運算子(&、|、~、^) 移位操作符(>> >> )

java按位運算子(&、|、~、^) 移位操作符(>> >> )

位運算子來源於C語言面向底層的操作,在這種操作中經常需要直接操作硬體,設定硬體暫存器內的二進位制位。Java的設計初衷是為了嵌入電視機機頂盒,所以種面向底層的操作仍被保留了下來。

1、“與”、“位與”(&)

        按位“與”操作符,如果兩個數的二進位制,相同位數都是1,則該位結果是1,否則是0.

  例1 5&4

        5的二進位制是  0000 0000 0000 0101

        4的二進位制是  0000 0000 0000 0100

        則結果是        0000 0000 0000 0100  轉為十進位制是4。

2、“或”、“位或”(|)

        按位“或”操作符,如果兩個數的二進位制,相同位數有一個是1,則該位結果是1,否則是0

  例2  5 | 4

        5的二進位制是  0000 0000 0000 0101

      4的二進位制是  0000 0000 0000 0100

        則結果是        0000 0000 0000 0101  轉為十進位制是5。

3、“異或、“位異或”(^)

        按位“異或”操作符,如果兩個數的二進位制,相同位數只有一個是1,則該位結果是1,否則是0

  例3  5 ^ 4

        5的二進位制是  0000 0000 0000 0101

        4的二進位制是  0000 0000 0000 0100

        則結果是        0000 0000 0000 0001 轉為十進位制是1 

4、“非”、“位非”(~)也稱為取反操作符

        按位“非”操作符,屬於一元操作符,只對一個運算元進行操作,(其他按位操作符是二元操作符)。按位“非”生成與輸入位相反的值,——若輸入0,則輸出1,若輸入1,則輸出0。

  例4  ~5

        5的二進位制是  0000 0000 0000 0101

        則~5是           1111 1111 1111 1010  轉為十進位制是 -6。

        這裡出現負數,強行插入一波^_^。

        電腦的的世界中只有0和1,那麼負數怎麼表示呢?

        二進位制的正負是從高位看,最高位如果1則是負數,如果是0則是正數。

        如果負數單純是把最高位變為1的話,在運算中會出現不是我們想要的值,所以引入了:原碼,反碼,補碼。正數的原碼,反碼,補碼都一樣,負數的反碼是對除了符號位(最高位)對原碼取反,補碼是對反碼+1

        負數的二進位制轉化,計算機計算是用的補碼

1、首先取出這個數的原碼的二進位制,

2、然後再求出反碼

3、最後求出補碼


  例5  -5

        -5的原碼是                1000 0000 0000 0101

        求出反碼的是            1111 1111 1111 1010

        求出補碼是                1111 1111 1111 1011

Java移位操作符

        移位操作符操作的運算物件也是二進位制的“位”。移位操作符只可用來處理整數型別,左移位操作符(<<)能按照操作符右側指定的位數將操作符左邊的運算元向左移動(在低位補0),“有符號”右移位操作符(>>)則按照操作符右側指定的位數將操作符左邊的運算元向右移。“有符號”右移位操作符使用“符號擴充套件”;若符號位正,則在高位插入0;若符號位負。則在高位插入1。java中增加了一種“無符號”右移位操作符(>>>),他使用“零擴充套件”;無論正負,都在高位插入0。這一操作符是C或C++中所沒有的。

  例6  5<<2 等於20
        5的二進位制是   0000 0000 0000 0101
        左移兩位         0000 0000 0001 0100
  例7  5>>2 等於 1
        5的二進位制是   0000 0000 0000 0101
        右移兩位         0000 0000 0000 0001
  例8  -5>>2 等於 -2
        -5的二進位制是   1111 1111 1111 1011
        右移兩位          1111 1111 1111 1110 轉十進位制,例5反著來,先-1,然後取反

Java運算子優先順序

優先順序 運算子分類 結合順序 運算子

分隔符 左結合 .    []     ( )     ;      ,
一元運算子 右結合 !  ++     --     -   ~

算術運算子

移位運算子

左結合 *     /      %    +     -      <<   >>   >>>
關係運算符 左結合 <     >     <=   >=   instanceof(Java 特有)   = =  !=
邏輯運算子 左結合 ! &&  ||  ~  &  |  ^ 
三目運算子 右結合 布林表示式?表示式1:表示式2
賦值運算子 右結合 =  *=     /=  %=   +=   -=    <<= >>= >>>=  &=  *=  |=

移位運算子

   移位運算子操作的物件就是二進位制的位,可以單獨用移位運算子來處理int型整數。

運算子 含義 例子
<< 左移運算子,將運算子左邊的物件向左移動運算子右邊指定的位數(在低位補0) x<<3
>> "有符號"右移運算 符,將運算子左邊的物件向右移動運算子右邊指定的位數。使用符號擴充套件機制,也就是說,如果值為正,則在高位補0,如果值為負,則在高位補1. x>>3
>>> "無符號"右移運算 符,將運算子左邊的物件向右移動運算子右邊指定的位數。採用0擴充套件機制,也就是說,無論值的正負,都在高位補0. x>>>3

 


原文:https://blog.csdn.net/mxiaoyem/article/details/78569782