位操作基礎#

基本運算符#

運算符名稱規則範例
&AND兩位都為 1 才為 11010 & 1100 = 1000
|OR有一位為 1 就為 11010 | 1100 = 1110
^XOR相異為 1,相同為 01010 ^ 1100 = 0110
~NOT0 變 1,1 變 0~1010 = 0101
<<左移左移 n 位0011 << 2 = 1100
>>右移右移 n 位1100 >> 2 = 0011

XOR 的特殊性質#

XOR(異或)在演算法中極為常用:

性質公式說明
與 0 異或x ^ 0 = x保持原值
與全 1 異或x ^ 1s = ~x相當於取反
自我異或x ^ x = 0結果為 0
交換律a ^ b = b ^ a
結合律(a ^ b) ^ c = a ^ (b ^ c)
可逆性A ^ B = CC ^ B = A經典:不用臨時變數交換兩數
XOR 交換兩數
// 不使用臨時變數交換 a 和 b
a = a ^ b;  // a = a^b
b = a ^ b;  // b = a^b^b = a
a = a ^ b;  // a = a^b^a = b

三大核心技巧#

1. 判斷奇偶性:x & 1#

最後一位為 1 是奇數,為 0 是偶數。

if ((x & 1) == 1) {
    // 奇數
} else {
    // 偶數
}

x & 1x % 2 更高效(直接位操作 vs 除法運算)。

2. 清除最低位的 1:x & (x - 1)#

將 x 二進位中最右邊的 1 變為 0。

x     = 1010...1000
x-1   = 1010...0111
x&(x-1) = 1010...0000

應用:計算二進位中 1 的個數(Hamming Weight)

int count = 0;
while (x != 0) {
    x = x & (x - 1);
    count++;
}

3. 取得最低位的 1:x & -x#

取出 x 二進位中最右邊的 1(Lowbit)。

x    = ...10100
-x   = ...01100  (補碼 = 取反 + 1)
x&-x = ...00100

應用:樹狀陣列(Binary Indexed Tree)

進階操作#

更多位操作技巧
操作公式說明
取得第 n 位(x >> n) & 10 或 1
設置第 n 位為 1x | (1 << n)
清除第 n 位x & ~(1 << n)
切換第 n 位x ^ (1 << n)0→1, 1→0
保留最低 n 位x & ((1 << n) - 1)
判斷是否為 2 的冪x > 0 && (x & (x-1)) == 0

進行移位操作時,注意整數型態的位數限制和符號位處理,避免溢位或非預期結果。

位操作速記表#

十進位     二進位
   6    =  110
  11    =  1011
  -1    =  1111...1111 (全1,補碼表示)

在二補數表示法中,-1 的二進位表示是全 1(111...111),這是常見的面試考點。