《编程珠玑》

用位操作实现位图:

#define BITSPERWORD 32
#define SHIFT 5
#define MASK 0x1F
#define N 10000000
int a[1 + N/BITSPERWORD];

void set(int i) { a[i>>SHIFT] |= (1<<(i & MASK)); } //就是将指定的bit赋1
void clr(int i) { a[i>>SHIFT] &= ~(1<<(i & MASK)); } //就是将指定的bit清0
int test(int i){ return a[i>>SHIFT] & (1<<(i & MASK)); } //就是取一下存入的值

这段代码读的时候竟然没完全理解,主要是1<<(i & MASK)

原来其意义是1左移(i & MASK)位,而我理解成了将(i & MASK)左移1位,基础还是不够扎实啊,引以为戒。其实比较容易想到的,因为算法的思路我是理解的,以后不要死脑筋。哈哈,这个操作符看来设计得不太好。

原文地址:https://www.cnblogs.com/ph829/p/5567673.html