位運算相關知識整理
阿新 • • 發佈:2020-08-05
位運算相關知識整理
介紹
計算機中的數在記憶體中都是以二進位制形式進行儲存的,用位運算就是直接對整數在記憶體中的二進位制位進行操作,因此其執行效率相當高。
位運算子
(以C語言為例)
符號 | 含義 | 運算規則 |
---|---|---|
& | 按位與 | 兩位都為1時,結果才為1,否則為0 |
| | 按位或 | 兩位都為0時,結果才為0,否則為1 |
^ | 按位異或 | 兩位相同時,結果為0,否則為1 |
~ | 按位取反 | 0變成1,1變成0 |
<< | 左移 | a << b 表示把a轉化成二進位制後左移b位,並補上b個0 |
>> | 右移 | a << b 表示把a轉化成二進位制後右移b位 |
>> 屬於帶符號右移,對於a >> b:
- 如果a為正數,在高位都補0
- 如果a為負數,在高位都補1
在Java中,存在無符號右移 >>>,即a無論正負,都在高位補0
按位與 &
運算規則:
- 0 & 0 = 0
- 1 & 0 = 0
- 1 & 1 = 1
- 0 & 1 = 0
應用:
-
判斷奇偶數
一個數的二進位制形式的最低位決定這個數奇偶,為1說明該數為奇數,為0說明該數為偶數
因此可以讓該數與1進行按位與操作來判斷奇偶,相對於取模運算,這種操作更快
例如判斷a的奇偶
- (a & 1) == 1 說明a為奇數
- (a & 1) == 0 說明a為偶數
-
統計二進位制中1的個數
對於數a,每執行一次a = a & (a - 1),a的二進位制就少一個1,因此可以用這種方法快速獲得二進位制中1的個數
int ans = 0 ; while(a) { a &= (a - 1) ; ans ++ ; }
按位或 |
運算規則:
- 0 | 1 = 1
- 1 | 0 = 1
- 0 | 0 = 0
- 1 | 1 = 1
按位異或 ^
運算規則:
- 0 ^ 1 = 1
- 1 ^ 0 = 1
- 1 ^ 1 = 0
- 0 ^ 0 = 0
因此,a^a=0,b^0=b
應用:
-
使用異或交換兩個數字
該方法可以不通過第三個臨時變數實現兩個變數的交換
例如交換a和b:
- a ^= b
- b ^= a
- a ^= b
說明:
第一步,a = (a ^ b)
第二步,b = b ^ (a ^ b) = a
第三步,a = (a ^ b) ^ a = b
-
指定位的反轉
例如對於數字3,二進位制為00000010,要翻轉該數字二進位制的低四位,即讓低四位1變成0,0變成1,可以讓該數字與00001111進行按位異或
按位取反 ~
應用:
-
交換符號,將正數變為負數,將負數變為正數
~a + 1 整數取反加一,正好變成其對應的負數;負數取反加一,變成其對應的正數
左移 <<
應用:
-
實現乘法
數 a 向左移一位,相當於將 a 乘以 2
int a = 1 ; a <<= 1 ; // a 等於 2
右移 >>
應用:
-
實現除法
數 a 向右移一位,相當於將 a 除以 2
int a = 2; a >>= 1 ; // a 等於 1