#include <stdio.h>
void set_bit(void *base, unsigned long n) {
unsigned long *m = (unsigned long *)base;
unsigned long size = sizeof(unsigned long) * 8; // 每塊位數(32或64)
m[n / size] |= 1UL << (n % size);
}
void clear_bit(void *base, unsigned long n) {
unsigned long *m = (unsigned long *)base;
unsigned long size = sizeof(unsigned long) * 8;
m[n / size] &= ~(1UL << (n % size));
}
int main() {
unsigned long value[2] = {0};
set_bit(value, 0);
set_bit(value, 63);
printf("Set:\n0x%016lx, 0x%016lx\n", value[0], value[1]);
clear_bit(value, 0);
clear_bit(value, 63);
printf("Clear:\n0x%016lx, 0x%016lx\n", value[0], value[1]);
return 0;
}
n / size 定位數組下標。n % size 定位字內位偏移。1UL << offset 生成單一位掩碼。| 設置位,& ~ 清除位。unsigned long 確保移位行為明確,避免符號擴展問題。大規模標記數組(如 Bloom Filter、內存分配器空閒塊管理、權限掩碼),極大節省內存並提升緩存命中率。