Bitmap有什么用
大量数据的快速排序、查找、去重
先说说为啥需要用到bitmap
假设有这样一个需求:在20亿个随机整数中找出某个数m是否存在其中
int32占4字节,1字节=8位(1 byte = 8 bit)
如果每个数字用int存储,那就是20亿个int,因而占用的空间约为(2000000000*4/1024/1024/1024)≈7.45 G
如果按位存储就不一样了,20亿个数就是20亿位,占用空间约为 (2000000000/8/1024/1024/1024)≈0.23 G
因此优势很容易能看出来了吧。
bitmap是什么
假如我们要存储 {1,4,6} 这三个数,那我们使用bitmap是如下表示方法:

在32位系统中 int占32位,我们只需要申请一个int数组长度为 int tmp[1+N/32] 即可存储,
因为我们可以用如下表示方法
tmp[0]:可以表示 0~31
tmp[1]:可以表示 32~63
tmp[2]:可以表示 64~95
如此一来,给定任意整数M,那么M/32就知道下标,M%32就知道它在此下标的哪个位置
插入
假如我们要在 {1,4,6} 中插入 5 这个数。

5/32 = 0 , 得到数组下标0
5%32 = 5 ,得到插入位置为5。
因此 我们把 1 << 5 得到 0010001,再与原数 0101001 进行或运算,结果得到 0111001
因此总结插入公式为:p + (i/8)|(1<<(i%8)) 其中,p表示现在的值,i表示待插入的数
删除
假设我们要在上面例子 {1,4,6} 中 6移除,该怎么做呢?

把1左移6位并取反 ~(1<<6) 得到 1011111
再与原数(0101001)进行与运算 得到 0001001
因此总结删除公式为:p & (~(1<<(i%8))) , p表示现在的值,i表示待插入的数
查找
假设我们要在上面例子 {1,4,6} ,判断3是否存在

总结查询公式为:p & (1<<(i%8)) ,如果结果大于0,则为存在
补充说明
与运算:在二进制中,只有前后两个运算数都是 1 的时候结果才是1
或运算:在二进制中,只有在两个比较的位不同时其结果是1
左移<<,相当于乘以2的n次方,例如:1<<6 相当于1×64=64,3<<4 相当于3×16=48
右移 >> ,相当于除以2的n次方,例如:64>>3 相当于64÷8=8
