首頁  >  文章  >  Java  >  java位元運算的技巧有哪些

java位元運算的技巧有哪些

PHPz
PHPz轉載
2023-04-29 10:34:061493瀏覽

什麼是位元操作

我們都知道資料在電腦儲存的形式是二進位數據,位元操作就是一種在二進位層面操作資料的方法,位元操作直接操作0,1構成的二進位資料。

基本的位元運算

基本的位元運算有六種,分別是** 與或非異或左移右移**

#符號 描述 #運算規則
& 兩個位元都為1時,結果才為1
兩個位元都為0時,結果才為0
^ 異或 兩個位元相同時,結果為1,不相同為0
~ 取反 0變1,1變0
左移 各二進位全部左移若干位,高位丟棄,低位補0
>> #右移 各二進位全部左移若干位,高位丟棄,高位補符號位,或補零,依不同編譯器
#
  • ** 首先,必須明確位元運算只能對整數進行操作**

  • #在jdk中,java右移是進行算術右移運算

  • ** 位元運算的優先權很低,所以最好用括號**

java位元運算的技巧有哪些

上述程式碼的輸出結果:

java位元運算的技巧有哪些

下面我們就分析為什麼會輸出這個結果:

  • 首先對於13 ,我們寫出他的二進制:0000 1101

  • #右移兩位: 0000 0011,由於jdk中的右移是算術右移,所以高位補00,結果為3

  • 對於-13,二進位代碼: 1111 0011

  • 右移兩位,高位補符號位,1111 1100,結果是-4

位元操作的常用技巧

#位元運算常用於一些小操作,由於他只能操作整形數,所以用途有限,但是一些常用的小技巧是非常值得掌握的,判斷奇偶,交換兩數,交換符號,求絕對值等。下面我們就將一一介紹。

判斷奇偶

奇偶的區別體現在二進位上,就是結尾是0,1 顯然當結尾為0時,是偶數,當結尾為1是最後一位奇數。所以判斷奇偶的方法是:

java位元運算的技巧有哪些

一個小的測試程式:

java位元運算的技巧有哪些

上面這個程式將會輸出所有1000以內的偶數

交換兩數

利用位元運算交換兩個數的好處是不用第三個temp變數(限制是只能交換整數變數)

java位元運算的技巧有哪些

分析交換是怎麼產生的:
首先a^=b 即a=(a^b);
b^=a 即b= b(ab),由於運算滿足交換律,b(ab)=bb^a。一個數和自己異或肯定是0,因為自己一定是等於自己的啦,那麼一個數和0異或的話,1和0異或還是1,0和0異或還是0,所以顯然一個數和0異或之後當然還是自己本身。所以此時,b被賦值為a。
最後一步,a^=b 是a=ab,由於前面二步可知a=(ab),b=a,所以a=ab即a=(a b)^a。故a會被賦上b的值。

變換符號

變換符號顯然很簡單,根據類似補碼,取反加一就可以了。

java位元運算的技巧有哪些

求絕對值

求絕對值就是在變換符號的基礎上實現的,我們只要先判斷是否為負數,若是負數,就變換符號,不是,就直接回傳。
判斷正負可以直接判斷其符號位,右移31位,取到符號位,判斷正負

java位元運算的技巧有哪些

#對於任何數,與0異或都會保持不變,與-1即0xFFFFFFFF異或就相當於取反。因此,a與i異或後再減i(因為i為0或-1,所以減i即是加0或加1)也可以得到絕對值。所以可以對上面程式碼優化下:

java位元運算的技巧有哪些

位元操作的應用

常見的演算法題,位元操作實現A B的操作是常見的演算法題。

java位元運算的技巧有哪些

上述程式碼就實作了不用 運算符,利用位元運算實作兩個數的相加運算。
現在我們來講解位運算實現兩個數相加的原理
首先,十進位中,我們知道,7 8,不進位和是5,進位是1,然後我們可以根據不進位和和進位5 1*10算出最後的結果15。
類似二進位也可以採取這種方法
例如
a = 3,b = 6
a : 0011
b : 0110
不進位和: 0101   也就是5
進位:0010  也就是2
所以a b變成5 (25    0101
2因此a b就變成了1 4 然後有
1    0001
4不進位和1001  = 9##進位0000  = 0
當時進位為0時,不進位和為9即a b之和。

可以發現上述是一個遞歸的過程,所以也就不難寫出程式碼了。求兩個數的不進位和實際上就是將兩個數異或操作即可。

以上是java位元運算的技巧有哪些的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除