在C++中,有现成的接口, bitmap。那如何实现自己的位数组呢,即按位操作。
有时会用到使用位数组对数据进行排序的情况(数据跨度不大,整数),这样在O(n)的时候内就可以完成排序。【编程珠玑上】的实现非常简单。
其实和内存定位是一样的,先缩写大范围,再缩写小范围。内存查找的时候,先找到相应的段地址,再在段内寻址。
使用数组实现,先定位到某一位在第几个数组元素中,再设定这个元素的第几位即可。整个过程使用位运算,提高效率。
#define BITSPERWORD 32 //使用整型数组,每一个数组元素含有32位
#define SHIFT 5 //除以32即右移5位
#define MASK 0X1F
#define N 10000000
int a[1+N/BITSPERWORD];
void set(int i) { a[i>>SHIFT] |= (1<<(i&MASK)); } // 和1或,即把某位设为1
void clr(int i) { a[i>>SHIFT] = ~(1<<(i&MASK)); } //和0与运算,即把某位0
// i>>SHIFT 定位到数组元素, i&MASK 得到低5位的值, 将 1 左移n位,即在一个32位的整数中,只有第n位是1