深入理解位運算操作及使用場景

2021-09-10 02:50:52 字數 3123 閱讀 7347

工作中一直沒用過位操作,只有在閱讀一些原始碼的時候會看到使用位運算子(因為直接使用位運算子效率更高),為了更好的閱讀原始碼那就好好學習一下吧,順便把學習的東西記下來。

位運算子大致就以下幾種吧。

位運算子名稱

符號用法

位求反~

~expr 

左移<<

expr1 << expr2

右移》expr1 >> expr2

無符號右移

>>>

expr1 >>> expr2位與&

expr1 & expr2位或|

expr1 | expr2

位異或^

expr1 ^ expr2

所有的位運算都是在二進位制下來進行運算的,再二進位制下只有0/1。

運算子規則是:將運算子後二進位制數反轉,0變1,1變 0,所以對乙個數取反偶數次結果是它本身。

例如:

0000 0000 0000 0000 0000 0000 0000 0011     -> 3

1111 1111 1111 1111 1111 1111 1111 1100 -> ~ 3 = -4

常用場景:

運算子規則是:各二進位全部左移若干位,高位丟棄,低位補0。

例如:6 << 2 = 24

0000 0000 0000 0000 0000 0000 0000 0110     -> 6

0000 0000 0000 0000 0000 0000 0001 1000 -> 6 << 2 = 24

我們將6的二進位向左移動兩位,低位補上兩個0,高位丟棄,得出來的結果就是24。

常用場景:

運算子規則是:各二進位全部右移若干位,正數高位補0,負數高位補1,低位丟棄。

例如: 12 >> 2 = 3

0000 0000 0000 0000 0000 0000 0000 1100     -> 12

0000 0000 0000 0000 0000 0000 0000 0011     -> 12 >> 2 = 3

因為12是正數,右移過程中高位補上兩個0,低位丟棄,得出來的結果就是3。

例如:-12 >> 2 = -3

1111 1111 1111 1111 1111 1111 1111 0100    -> -12

1111 1111 1111 1111 1111 1111 1111 1101    -> -12 >> 2 = -3

因為-12是負數,右移過程中高位補上兩個1,低位丟棄,得出來的結果就是-3。

常用場景:

運算子規則是:各二進位全部右移若干位,高位補0,低位丟棄。

例如: 12 >>> 2 = 3

0000 0000 0000 0000 0000 0000 0000 1100     -> 12

0000 0000 0000 0000 0000 0000 0000 0011     -> 12 >>> 2 = 3

我們將12的二進位向右移動兩位,高位補上兩個0,低位丟棄,得出來的結果就是24。

例如:-12 >>> 2 = 1073741821

1111 1111 1111 1111 1111 1111 1111 0100    -> -12

0011 1111 1111 1111 1111 1111 1111 1101    -> -12 >> 2 = 1073741821

我們將-12的二進位向右移動兩位,高位補上兩個0,低位丟棄,得出來的結果就是1073741821。

運算子規則是:運算子兩邊有0,結果就為0 ,只有當兩邊同時為1是,結果才為1。

如下:0 & 0 = 0;     0 & 1 = 0;     1 & 0 = 0;       1 & 1= 1;

例如:3&5  

0000 0000 0000 0000 0000 0000 0000 0011     -> 3

0000 0000 0000 0000 0000 0000 0000 0101 -> 5

0000 0000 0000 0000 0000 0000 0000 0001 -> 3 & 5 = 1

位與運算的特殊用途:

運算規則就是 運算子兩邊有1,結果就為1 ,只有當兩邊同時為0是,結果才為0。

如下:0 | 0 = 0;  0 | 1 = 1;  1 | 0 = 1;   1 | 1 = 1 ;

例如:3|5 

0000 0000 0000 0000 0000 0000 0000 0011     -> 3

0000 0000 0000 0000 0000 0000 0000 0101 -> 5

0000 0000 0000 0000 0000 0000 0000 0111 -> 3 | 5 = 7

另,負數按補碼形式參加按位或運算。

使用場景:

下面這個方法是摘自hashmap類,這個演算法來修改使用者使用構造器傳進來的size的,這個演算法是使用移位和或結合來實現的,效能上比迴圈判斷要好。

public static final int tablesizefor(int cap)
運算規則是:當運算子兩邊相同位置都是相同,結果返回0,不相同時返回1。

例如:3 ^ 5 = 1

0000 0000 0000 0000 0000 0000 0000 0011     -> 3

0000 0000 0000 0000 0000 0000 0000 0101 -> 5

0000 0000 0000 0000 0000 0000 0000 0110 -> 3 ^ 5 = 6

通常我們交換兩個數會使用乙個臨時變數來幫忙:

int t = a;

a = b;

b = t;

使用 ^ 位運算子(裝逼必備)

a ^= b;

b ^= a;

a ^= b;

位運算 深入理解並證明 lowbit 運算

比如當 n 5 的時候,5 的二進位制是 0101 所以有 lowbit 5 1 比如當 n 10 的時候,10 的二進位制是 1010,所以有 lowbit 10 2 lowbit運算 c c 實現語句 1 函式 int lowbit int x 2 巨集定義 define lowbit x x ...

位運算的應用場景及作用

位運算加速技巧 本方法可以讓c c 語言指令進一步接近彙編指令的執行效率,提高嵌入式系統的速度和穩定性。x x 2 x x 64 改為 x x 1 2 21 x x 6 64 26 x x 2 x x 64 改為 x x 1 2 21 x x 6 64 26 x int 1.232 改為 x 1.2...

Java 位運算子 深入理解

作用是對運算子兩側以二進位制表達的操作符按位分別進行 與 運算。而這一運算是以數中同樣的位 bit 為單位的。操作的規則是 僅當兩個運算元都為1時。輸出結果才為1。否則為0 示比例如以下 12 的二進位制為 0000 1100.5 的二進位制為 0000 0101.則 12 5 的二進位制為 000...