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

位運算相關知識整理

位運算相關知識整理

介紹

計算機中的數在記憶體中都是以二進位制形式進行儲存的,用位運算就是直接對整數在記憶體中的二進位制位進行操作,因此其執行效率相當高。

位運算子

(以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:

    1. a ^= b
    2. b ^= a
    3. 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