-5 (8位) → 00000101 → 取反 11111010 → +1 11111011 (即 0xFB)。| 運算符 | 名稱 | 真值表 | 典型用途 |
|---|---|---|---|
~ | 按位取反 (一元) | 0→1, 1→0 | 生成掩碼、翻轉標志位 |
& | 按位與 | 1&1=1, 其他=0 | 清零位、檢查位、掩碼提取 |
| | 按位或 | 0|0=0, 其他=1 | 置位、合併標志位 |
^ | 按位異或 | 相同=0, 不同=1 | 翻轉位、簡單加密、交換變量 |
掩碼:特定位為 1、其餘為 0 的常量,用於操作目標值的特定位。
#define MASK_BIT(n) (1u << (n)) // 第 n 位為 1 (從 0 開始)
unsigned int flags = 0;
// 置位 (開啟第 3 位)
flags |= MASK_BIT(3);
// 清零 (關閉第 3 位)
flags &= ~MASK_BIT(3);
// 翻轉 (切換第 3 位)
flags ^= MASK_BIT(3);
// 檢查 (第 3 位是否為 1)
if (flags & MASK_BIT(3)) { ... }
// 批量操作
#define READY_MASK 0x01 // bit 0
#define ERROR_MASK 0x02 // bit 1
#define BUSY_MASK 0x04 // bit 2
flags |= READY_MASK | BUSY_MASK; // 同時置位
flags &= ~(ERROR_MASK | BUSY_MASK); // 同時清零
| 運算符 | 行為 | 等價算術 | 注意事項 |
|---|---|---|---|
<< | 左移,低位補 0,高位丟棄 | 乘 2n (無溢出時) | 有符號左移溢出為 UB |
>> | 右移,高位:無符號補 0,有符號實現定義 (通常算術移位補符號位) | 除 2n (非負時) | 負數右移結果依賴編譯器 |
#define BYTE_MASK 0xFF
unsigned long color = 0x002A162F; // RRGGBB
unsigned char red = color & BYTE_MASK; // 2F
unsigned char green = (color >> 8) & BYTE_MASK; // 16
unsigned char blue = (color >> 16) & BYTE_MASK; // 2A
int invert_end(int num, int bits) {
unsigned int mask = 0;
for (int i = 0; i < bits; i++) mask |= (1u << i); // 低 bits 位全 1
return num ^ mask;
}
在結構體中指定成員佔用的位數,編譯器自動打包。
struct PrinterFlags {
unsigned int auto_feed : 1;
unsigned int bold : 1;
unsigned int underline : 1;
unsigned int italic : 1;
unsigned int reserved : 28; // 填充到 32 位
} prnt;
prnt.bold = 1; // 直接賦值 0/1
prnt.italic = 0;
// 編譯器自動生成掩碼、移位代碼
int、signed int、unsigned int (C99 允許 _Bool)。sizeof(struct) 通常為 4/8 字節 (對齊單位)。&prnt.bold (非字節對齊)。
enum Perm { READ = 1<<0, WRITE = 1<<1, EXEC = 1<<2, ADMIN = 1<<3 };
void grant(int *perm, int p) { *perm |= p; }
void revoke(int *perm, int p) { *perm &= ~p; }
bool check(int perm, int p) { return (perm & p) == p; }
int main() {
int user = 0;
grant(&user, READ | WRITE);
printf("Has READ? %d\n", check(user, READ)); // 1
revoke(&user, WRITE);
printf("Has WRITE? %d\n", check(user, WRITE)); // 0
return 0;
}
1 << 32 (32位 int) 為 UB → 用 1ull << 32。htonl/掩碼打包。<stdint.h> 固定寬度、<stdatomic.h> 原子位操作 (C11)。