java-- 位運算

一,Java 位運算 java

1.表示方法:  post

在Java語言中,二進制數使用補碼錶示,最高位爲符號位,正數的符號位爲0,負數爲1。補碼的表示須要知足以下要求。  spa

(1)正數的最高位爲0,其他各位表明數值自己(二進制數)。  對象

(2)對於負數,經過對該數絕對值的補碼按位取反,再對整個數加1。 blog

2.位運算符  編譯器

 

 

位運算表達式由操做數和位運算符組成,實現對整數類型的二進制數進行位運算。位運算符能夠分爲邏輯運算符(包括~、&、|和^)及移位運算符(包括>>、<<和>>>)。 編譯

1)左移位運算符(<<)能將運算符左邊的運算對象向左移動運算符右側指定的位數(在低位補0)。 class

2)「有符號」右移位運算符(>>)則將運算符左邊的運算對象向右移動運算符右側指定的位數。 「有符號」右移位運算符使用了「符號擴展」:若值爲正,則在高位插入0;若值爲負,則在高位插入1。變量

3)Java也添加了一種「無符號」右移位運算符(>>>),它使用了「零擴展」:不管正負,都在高位插入0。這一運算符是C或C++沒有的。 擴展

4)若對char,byte或者short進行移位處理,那麼在移位進行以前,它們會自動轉換成一個int。 只有右側的5個低位纔會用到。這樣可防止咱們在一個int數裏移動不切實際的位數。 若對一個long值進行處理,最後獲得的結果也是long。此時只會用到右側的6個低位,防止移動超過long值裏現成的位數。 但在進行「無符號」右移位時,也可能遇到一個問題。若對byte或short值進行右移位運算,獲得的可能不是正確的結果(Java 1.0和Java 1.1特別突出)。 它們會自動轉換成int類型,並進行右移位。但「零擴展」不會發生,因此在那些狀況下會獲得-1的結果。 

在進行位運算時,須要注意如下幾點。   

(1)>>>和>>的區別是:在執行運算時,>>>運算符的操做數高位補0,而>>運算符的操做數高位移入原來高位的值。   

(2)右移一位至關於除以2,左移一位(在不溢出的狀況下)至關於乘以2;移位運算速度高於乘除運算。   

(3)若進行位邏輯運算的兩個操做數的數據長度不相同,則返回值應該是數據長度較長的數據類型。   

(4)按位異或能夠不使用臨時變量完成兩個值的交換,也可使某個整型數的特定位的值翻轉。   

(5)按位與運算能夠用來屏蔽特定的位,也能夠用來取某個數型數中某些特定的位。   

(6)按位或運算能夠用來對某個整型數的特定位的值置l。

3.位運算符的優先級  

~的優先級最高,其次是<<、>>和>>>,再次是&,而後是^,優先級最低的是|。 

 

二, 按位異或運算符^ 

 參與運算的兩個值,若是兩個相應位相同,則結果爲0,不然爲1。即:0^0=0, 1^0=1, 0^1=1, 1^1=0 

例如:10100001^00010001=10110000

   0^0=0,0^1=1 0異或任何數=任何數 

   1^0=1,1^1=0 1異或任何數-任何數取反 

   任何數異或本身=把本身置0

(1)按位異或能夠用來使某些特定的位翻轉,如對數10100001的第2位和第3位翻轉,能夠將數與00000110進行按位異或運算。                     10100001^00000110=10100111 //1010 0001 ^ 0x06 = 1010 0001 ^ 6 

(2)經過按位異或運算,能夠實現兩個值的交換,而沒必要使用臨時變量。

例如交換兩個整數a,b的值,可經過下列語句實現:

 a=10100001,b=00000110 

 a=a^b;   //a=10100111 

 b=b^a;   //b=10100001

 a=a^b;   //a=00000110

(3)異或運算符的特色是:數a兩次異或同一個數b(a=a^b^b)仍然爲原值a.

 

 三,Java 中除了二進制的表示方法: 

因爲數據在計算機中的表示,最終以二進制的形式存在,因此有時候使用二進制,能夠更直觀地解決問題。 

 但,二進制數太長了。好比int 類型佔用4個字節,32位。好比100,用int類型的二進制數表達將是: 

 0000 0000 0000 0000 0110 0100

 面對這麼長的數進行思考或操做,沒有人會喜歡。所以,C,C++,以及java中 沒有提供在代碼直接寫二進制數的方法。 

 八進制數的表達方法 

 如何表達一個八進制數呢?若是這個數是 876,咱們能夠判定它不是八進制數,由於八進制數中不可能出7以上的阿拉伯數字。但若是這個數是12三、是567,或12345670,那麼它是八進制數仍是10進制數,都有可能。

 因此規定,一個數若是要指明它採用八進制,必須在它前面加上一個0,如:123是十進制,但0123則表示採用八進制。這就是八進制數的表達方法。 如今,對於一樣一個數,好比是100,咱們在代碼中能夠用日常的10進製表達,例如在變量初始化時: 

 int a = 100; 

 咱們也能夠這樣寫:

 int a = 0144; //0144是八進制的100;一個10進制數如何轉成8進制。 

 千萬記住,用八進制表達時,你不能少了最前的那個0。不然計算機會統統當成10進制。不過,有一個地方使用八進制數時,卻不能使用加0,那就是咱們前面學的用於表達字符的「轉義符」表達法。

 十六進制數的表達方法 

 若是不使用特殊的書寫形式,16進制數也會和10進制相混。隨便一個數:9876,就看不出它是16進制或10進制。 

 16進制數必須以 0x開頭。好比 0x1表示一個16進制數。而1則表示一個十進制。另外如:0xff,0xFF,0X102A,等等。其中的x也也不區分大小寫。(注意:0x中的0是數字0,而不是字母O) 

 如下是一些用法示例:

 int a = 0x100F; 

 int b = 0x70 + a; 

 最後一點很重要,10進制數有正負之分,好比12表示正12,而-12表示負 12,;但8進制和16進制只能用來表達無符號的正整數,若是你在代碼中裏:-078,或者寫:-0xF2,編譯器並不把它當成一個負數。

相關文章
相關標籤/搜索