1. 程式人生 > 實用技巧 >演算法學習-位運算

演算法學習-位運算

1. 補碼

由於CPU在進行設計的時候只進行了加法器的設計,所以在它只會處理加法操作,那麼問題來了如何進行減法操作呢?例如:A-B,我們可以將其看作是A+(-B)的形式。這樣在計算機內部就會出現負數的形式,所以就引入了補碼的概念,補碼就是對數字進行按位取反再加一的操作,補碼在計算機中進行儲存負數。

2. 移位運算

1. 左移

就是將二進位制中的bit位向左移動一位,低位用0進行填充,高位越界後捨棄。

2. 右移

1. 算數右移

就是將二進位制中的bit位向右移動一位,高位用符號位進行填充,低位越界後捨棄。值得注意的一點-3>>1=-2, -3/2 = -1,算數右移按照向下取證的觀點,除法運算按照向0取證的觀點。

2. 邏輯右移

就是將二進位制中的bit位向右移動一位,高位用0進行填充,低位越界後捨棄。

3. 二進位制狀態壓縮

將一個長度為m的bool陣列用二進位制整數的每一bit位來表示並存儲的方法。

常用操作:

1. 取出n的第k位bit的數值:n>>k & 1

2. 取出n的0-k位的數值:n & ((1 << k) -1)

3. 將n的第k位進行取反操作:n ^ (1 << k)

4. 將n的第k位賦值成1:n | (1 << k)

5. 將n的第k位賦值成0:n & (~(1<<k))

4. 成對交換

我們對n進行n^1的操作時發現,如果n為奇數這個操作可以轉化成與他相鄰的偶數,n ^ 1 ^ 1這樣可以得到n本身,這樣的數字交換稱為成對交換。

5. lowbit運算

lowbit(n)表示非負數的最後一位1表示的數值是多少

inline int lowbit(int n){
      return n & -n;
}