最近看编程珠矶的第一章位图排序,对位运算不是太理解,网上查了些资料,总结如下:
#define BITSPERWORD 32
#define SHIFT 5
#define MASK 0x1F
#define N 10000000
int a[1 + N / BITSPERWORD]
假设一个整形数字是由4个字节构成, a是位数组
1.置位操作:
void set(int i) {
a[i>>SHIFT] |= (1<<(i & MASK));
}
要给相应的位置位先要寻找行号:i / 32,即:i >> SHIFT
再寻找列号:i % 32,即 i & MASK,这里解释下为什么这两个表达式等价。i % 32即i对32取模,得到一个0-31之间的一个数,
同样由于MASK = 0x1F = 31,所以 i & MASK 同样是一个0-31之间的一个数。
最后给a[i>>SHIFT] 中相应的列置位 a[i>>SHIFT] |= (1<<(i & MASK)),或操作并不改变其它列的结果。
2.清除操作:
void clr(int i) {
a[i>>SHIFT] &= ~(1<<(i & MASK));
}
3.测试操作:
int test(int i){
return a[i>>SHIFT] & (1<<(i & MASK));
}
阅读(193) | 评论(0) | 转发(0) |