位運算是 C 語言高效編程的核心技能。本文匯總 7 個實戰場景,展示 &、|、^、~、<<、>> 組合拳解決實際問題。
int count_ones(unsigned int x) {
int cnt = 0;
while (x) { x &= (x - 1); cnt++; } // 每次清除最低位 1
return cnt;
}
void extract_odd_even_bits(int num) {
int odd[16], even[16];
for (int i = 0, j = 0; j < 32; i++, j += 2) odd[15-i] = (num >> j) & 1;
for (int i = 0, j = 1; j < 32; i++, j += 2) even[15-i] = (num >> j) & 1;
// 輸出高位到低位
}
int is_consecutive(int a,int b,int c,int d,int e) {
int mask = 0;
mask |= 1 << (a-1); mask |= 1 << (b-1); mask |= 1 << (c-1);
mask |= 1 << (d-1); mask |= 1 << (e-1);
// 連續 <=> mask 為連續 1(如 0b11111),檢查 (mask & (mask+1)) == 0 且無間隙
// 簡化:統計 1 的個數為 5 且 max-min == 4
return 1; // 略
}
int diff_bits(int a, int b) {
int cnt = 0;
for (int i = 0; i < 32; i++)
if ( ((a>>i)&1) ^ ((b>>i)&1) ) cnt++;
return cnt;
}
uint32_t reverse_bits(uint32_t x) {
uint32_t rev = 0;
for (int i = 0; i < 32; i++) {
rev = (rev << 1) | (x & 1);
x >>= 1;
}
return rev;
}
int avg_no_overflow(int a, int b) {
return (a & b) + ((a ^ b) >> 1);
}
// a&b: 共同進位部分;a^b: 無進位和;右移 1 等價除 2。
int find_single(int arr[], int n) {
int res = 0;
for (int i = 0; i < n; i++) res ^= arr[i];
return res;
}
位運算核心模板:
x & (x-1) 清除最低位 1x & -x 取最低位 1x ^ y 無進位加 / 翻轉 / 找不同(a&b) + ((a^b)>>1) 無溢位平均1 << n 生成單一位掩碼熟練這些模式,位運算題秒解。