位運算基礎

基礎知識和算法合集:https://blog.csdn.net/GD_ONE/article/details/104061907

1.什麼是位運算

 位運算又稱爲位操作,指的是直接對二進制位進行的一系列操作。

2.位運算有哪些

  1. AND( & )
    按位與
    1 & 1 = 1
    1 & 0 = 0
    0 & 0 = 0
    1101 & 1100 = 1100

  2. OR( | )
    按位或
    1 | 1 = 1
    1 | 0 = 1
    0 | 0 = 0
    1001 | 1010 = 1011

  3. XOR( ^ )
    按位異或
    1 ^ 1 = 0
    0 ^ 0 = 0
    1 ^ 0 = 1
    0 ^ 1 = 1
    1101 ^ 1100 = 0001

  4. NOT( ~ )
    取反
    ~1 = 0
    ~0 = 1
    ~0111 = 1000
    另:& | ^ ~ 是c或類c的編程語言中所用的位操作符。 除了~是單目運算符
    其餘的三個都是雙目運算符。

  5. 移位運算

    • 左移運算符: <<

      二進制表示下把數字同時向左移, 低位以0填充, 高位越界後捨棄。

    • 右移運算符: >>
      右移運算又分爲算術右移和邏輯右移。
      • 算術右移:

        在二進制補碼表示下,把數字同時向右移位,高位以符號位填充,低位越界後捨棄。

        對於 n >> 1 在C/C++中相當於 n/2 下取整。

      • 邏輯右移:

        在二進制補碼錶示下把數字同時向右移動,高位以0填充,低位越界後捨棄。

        C++並沒有規定右移的方式,所以編譯器不同,可能實現的方式也不一樣。
        不過說了這麼多,總結下來其實就是:
        00001 << 2 = 00100
        00100 >> 2 = 00001

3.常用的位運算操作

  1. (n>>k) &1 取出整數n在二進制表示下的第k位

  2. n & ((1 << k) - 1) 取出整數n在二進制表示下的第0~k-1位(後k位)

  3. n ^ (1 << k) 把整數n在二進制表示下的第k位取反

  4. n | (1 << k) 把整數n在二進制表示下的第k位賦值爲1

  5. n & (~(1 << k)) 把整數n在二進制表示下的第k位賦值爲0

  6. n ^ (1 << k) = n - (1<<k)

  7. 除以2
    a / 2 = a >> 1
    a + b / 2 == a + b >> 1 ( + - 運算的優先級高於 <<, >> )

  8. 判斷奇偶
    一個數的二進制數的最低位如果是1 則該數一定是奇數 否則一定是偶數
    所以 用 a & 1 檢測最低爲是否位1

    if(a & 1) cout<<"奇數";
    else cout<<"偶數" 
    
  9. 快速冪

  10. 狀態壓縮
    以一個二進制數表示一個狀態集合。
    如 n = 1100 S = {2, 3} S表示狀態所有爲1的集合。

  11. 成對變換

    當n 爲偶數時 n ^ 1 = n + 1
    當n爲奇數時 n ^ 1 = n - 1
    所以
    (0,1) (2, 3) (4, 5)… 關於 ^1 運算 構成“成對變換”
    這一性質常用於圖論鄰接表中邊集的存儲。在具有無向邊(雙向邊)的圖中把一對正反方向的邊分別存儲在鄰接表數組中的第n和第n+1位置(n爲偶數),就可以通過^1
    的運算獲得與當前邊(x, y) 反向的邊(y, x)的存儲位置。
    摘自<<算法競賽進階指南>>

  12. lowbit運算

    lowbit(n) 定義爲非負整數n在二進制表示下"最低爲1及其後邊所有0"構成的數值. 例如 n = 10
    的二進制表示爲(1010)2, 則lowbit(n) = 2 = (10)2 .
    lowbit(n) = n & (~n + 1) = n&(-n)
    摘自<<算法競賽進階指南>>

發佈了70 篇原創文章 · 獲贊 237 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章