1. 程式人生 > 實用技巧 >Java位運算知識點整理

Java位運算知識點整理

最近因為工作的原因,需要使用到一些位運算相關的知識點,所以重新回顧和整理了一下。

位操作基礎

符號描述運算規則
& 與運算 兩個位都是1時,結果才為1
| 或運算 兩個位都是0時,結果才為0
^ 異或 兩個位相同時為0,不同時為1
~ 取反 0變1,1變0
<< 左移 各二進位制全部左移若干位,高位丟棄
>> 右移 各二進位制全部右移若干位,對無符號數,高位補0,有符號數,各編譯器處理方法不一樣,有的補符號位(算術右移),有的補0(邏輯右移)
Java中左邊空出的位用0或者1填,正數用0負數用1填,低位右移溢位則捨棄該位。

注意以下幾點:

  1. 在這6種操作符,只有~取反是單目操作符,其它5種都是雙目操作符。
  2. 位操作只能用於整形資料,對float和double型別進行位操作會被編譯器報錯。
  3. 位操作符的運算優先順序比較低,因為儘量使用括號來確保運算順序,否則很可能會得到莫明其妙的結果。比如要得到像1,3,5,9這些2^i+1的數字。寫成int a = 1 « i + 1;是不對的,程式會先執行i + 1,再執行左移操作。應該寫成int a = (1 « i) + 1;
  4. 另外位操作還有一些複合操作符,如&=、|=、 ^=、«=、»=。

看下常用的左移和右移操作

比如針對「01001000」進行移位操作 左移2位 => 00100000 右移2位 => 00010010

10進位制、2進位制、16進位制之間的轉換

2進位制和10進位制間的轉換

10進位制到2進位制的轉換,我們可以通過2進位制的每移動一個高位都是2的n次方來分析,從低到高分別是0,2,4,8,16,32…… 這個時候當出現一個10進位制的值時,可以優先查詢它的最大2的n次方的值,比如35,可以拆解為32+2+1,那對應到2進位制的表示就是 100011。下面用表格來表達會更清楚。 用下面的表格表示一個8位的2進位制(用8位是因為byte是8位)

二進位制00000000
十進位制 128 64 32 16 8 4 2 0

2進位制和16進位制互轉

16進位制的字符集是 「0123456789ABCDEF」,分別代表著從0到15的數字 一個16進位制的值需要4位2進位制來表示,因為F也就是15用2進製表示是1111,剛好是4位二進位制的最大值,不足4位的用0補位。

一個16進位制是用4位2進製表示,所以轉換前,可以先將2進位制拆分為多個4位一組資料 比如010000,先進行補位,結果是 00010000,再拆分為0001和0000,換成16進製表示就是1和0 比如01111111,拆分為0111和1111,轉成10進位制是7和15,再轉成16進位制就是7F。

byte為什麼要與上0xFF?

主要原因是byte輸出轉成int時,因為byte是8位,而int是32位,所以需要進行補位,如果是負數的情況下,前面會用1進行補位操作,這個時候生成的結果就不是我們想要的結果了。而和0xFF進行與操作是什麼結果呢,0xFF用二進位制表示是11111111,和這個進行與操作後,其實byte本身的結果不會變,但是前面的高位部分會被替換為0,這樣就可以保持二進位制資料的一致性。

詳細的可以引數下面的連結文章,講的比較詳細了。 或者將下面這兩個byte進行輸出看下結果。

byte a = (byte) 0b01011010;
byte b = (byte) (0b10101010);
print(b & 0xFF);

輸出結果:
01011010
11111111111111111111111110101010
10101010

顯然第二個不是我們想要的結果,第三個和0xFF進行與操作後的結果才是我們真實想要的。

參考:https://blog.csdn.net/xiaozhouchou/article/details/79086604