Bit Manipulation

基本觀念

Bit Manipulation 只有幾種基本運算: and, or, xor, not, <<, >>。

常用技巧:

簡單技巧

  • n & (n-1)能够去掉 n 最右邊一位的 1
  • n & -n 能夠取出最後一位 1 (e.g. n==110, -n==010, n&-n==010)

數有幾個 1

Loop n & (n-1) 直到 n == 0,可以算出 n 有幾個 1

int count_one(int n)
{
    int count = 0;

    while(n != 0)
    {
        n = n&(n-1);
        count++;
    }
    return count;
}

進階技巧

自己做 bit 加法

XOR 的概念很像加法,原本是 0 的東西遇到 1,就會變成 1,再遇到下一個 1 的時候,就會變成 0。可以參考這個 comment 跟這個 comment

做法:

讓 b0 b1
0 0
1 0
0 1
0 0

加到第三次就會循環。

b0 = b0^A[i]&(~b1)
b1 = b1^A[i]&(~b0)

範例一:

X  = 1 1
X  = 1 1
Y  = 0 1
X  = 1 1

初始:
b0 = 0 0
b1 = 0 0

第一次 X:
b0 = 1 1
b1 = 0 0

第二次 X:
b0 = 0 0
b1 = 1 1

第一次 Y:
b0 = 0 0
b1 = 1 0

第三次 X:
b0 = 0 1
b1 = 0 0

範例二:

X  = 1 1
X  = 1 1
Y  = 0 1
X  = 1 1
Y  = 0 1

第一次 X:
b0 = 1 1
b1 = 0 0

第二次 X:
b0 = 0 0
b1 = 1 1

第一次 Y:
b0 = 0 0
b1 = 1 0

第三次 X:
b0 = 0 1
b1 = 0 0

第二次 Y:
b0 = 0 0
b1 = 0 1

Reference

results matching ""

    No results matching ""