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

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

java按位運算子(操作符)

  最近在看原始碼時,發現一些java基礎有些記不清了。今天來回憶,整理一下。

按位運算子是來操作整數基本資料型別中的單個“位元”(bir),即二進位制位,位運算子會對兩個引數中對應的位執行布林代數運算,並最終生成一個結果。

        位運算子來源於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

例25 | 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 75>>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,然後取反     >>>就不舉例了。和例7大同小異。         如果對char、byte或者short型別的數值進行移位處理,那麼在移位進行之前,它們會被轉為int型別,並且得到結果也是一個int型別的值,只有數值右端的底5位才有用,這樣可防止我們移位超過int型別所具有的位數,(因為2的5次方位為32,而int型別只有32位)。若對一個long型別的數值進行處理,最後得到結果也是long型別,此時只會用到數值右端的底6位,以防止移位超過long型別數值具有的位數。         “移位”可與“等號”(<<=或>>=或>>>=)組合使用。此時,操作符左邊的值會移動由右邊的值指定的位數,再將得到的結果賦值給左邊的變數。但在進行“無符號”右移位結合賦值操作時,可能會遇到一個問題,如果對byte或short值進行這樣的移位運算,得到的可能不是正確的結果。他們會先被轉換成int型別,再進行右移操作,然後被截斷,賦值給原來的型別,在這種情況下可能得到-1的結果。