C 語言被稱為「中級語言」,因其能直接操作硬件。位操作是底層編程、嵌入式開發、驅動程序編寫、高性能算法的基石。掌握位運算,即掌握了對計算機最基本存儲單元——位的控制權。
00000000~11111111)。char c = 100; 二進制 01100100(十六進制 0x64)。| 運算符 | 名稱 | 類型 | 規則 | 典型用途 |
|---|---|---|---|---|
& | 位與 | 雙目 | 同為 1 結果 1,否則 0 | 清零特定位、掩碼檢測 |
| | 位或 | 雙目 | 同為 0 結果 0,否則 1 | 置位特定位、合併標誌 |
^ | 位異或 | 雙目 | 相同為 0,不同為 1 | 翻轉特定位、加密、校驗 |
~ | 取反/補碼 | 單目 | 0 變 1,1 變 0 | 生成掩碼、位翻轉 |
僅限整型表達式使用。
// 設置第 6 位為 1(掩碼 0x40 = 01000000)
c = c | 0x40;
// 清零第 6 位(掩碼 0xBF = 10111111)
c = c & 0xBF;
// 翻轉第 6 位(掩碼 0x40)
c = c ^ 0x40;
// 僅保留第 6 位,其餘清零
c = c & 0x40;
| 運算符 | 名稱 | 行為 | 數學等價 |
|---|---|---|---|
<< | 左移 | 低位補 0,高位丟棄 | 乘以 2n |
>> | 右移 | 無符號高位補 0;有符號保持符號位(算術右移) | 除以 2n(向下取整) |
int a = 5; // 00000101
int b = a << 2; // 00010100 = 20 (5*4)
int c = a >> 1; // 00000010 = 2 (5/2)
注意:移位數不得超過類型位寬,否則行為未定義。
問題:輸入整數,輸出其二進制表示中 1 的個數。如 67 (0x43) → 3。
#include <stdio.h>
int countOnes(int num) {
int count = 0;
while (num) {
count += num & 1; // 檢查最低位
num >>= 1; // 右移一位
}
return count;
}
int main() {
int num;
scanf("%d", &num);
printf("%d\n", countOnes(num));
return 0;
}
進階優化:num &= (num - 1) 可直接清除最低位的 1,循環次數等於 1 的個數(Brian Kernighan 算法)。
位操作看似晦澀,實則是通往計算機底層的鑰匙。熟練掌握 & | ^ ~ << >>,配合掩碼技巧,能編寫出極致高效、資源節約的代碼。