一、原理
(1)
一个字节Byte共8个bit位,使用每一位表示为一个元素。
即:这个元素存在,则对应的bit位是1,否则为0
例:
二进制表示的一个字节 10010010
实际的元素 7 4 1
本例子中使用int,4个字节共32位, int bitmap[N]
bitmap[0] 0 ~ 31
bitmap[1] 32 ~ 63
bitmap[2] 64 ~ 95
......
bitmap[N] 32N ~ 32(N+1) - 1
(2)
求num所在数组的下标
num / 32 ,使用移位操作更快捷,即 num >> 5
求num在一个int中的那个对应位
num % 32, 使用位操作,即 num & 0x1f
二、优缺点
缺点:
(1)表现的
(2)不能操作有重复的元素
优点:
(1)压缩存储,节省空间
(2)操作简单,时间复杂的为O(1)
用于大数据量并且没有重复的数据的排序,无需比较
三、代码实现
#define MOD 0x1f #define SHR 5 #define N 100 //这个根据实际情况写,也可以根据输入确定 int bitmap[N >> 5 + 1]; void set_bit(int bitmap[], int num) { bitmap[num >> SHR] |= (1 << (num & MOD)); } void clear_bit(int bitmap[], int num) { bitmap[num >> SHR] &= ~(1 << (num & MOD)); } void clear2_bit(int bitmap[], int num) { bitmap[num >> SHR] ^= (bitmap[num >> SHR] & (1 << (num & MOD))); } int find_bit(int bitmap[], int num) { return (bitmap[num >> SHR] & (1 << (num & MOD))) != 0; }