一、简单介绍
位图就是用每一位 来标记一个数是否存在, 相比bool类型, 极大的节省了空间。
如果你想存maxn个数,最多只要 开maxn/32 + 1个 int(32位)的数组就行。
位图的操作:
①初始化为零,表示数数字都不存在
②标记某个数字
③删除某个数字的标记
④查询某个数字是否存在
二、实现原理:
1、初始化为0:
这个很简单,就是将数组初始化为0, 每一位就变为0了。
2、标记某个数字:
举个例子, 如果你想将 数字1206标记:
首先 1206 整除32 == 32
然后 1026 mod 32 ==2
所以只要将 下标为32的数组元素中第2位标记为1就行了。
实现 :bitmap[1026/32] |= 1<<(1026%32);
1026/32 可以换成1026>>5 , 1026%32 可以换成1026&31
↓ 存完1026 后 bitmap[32]的二进制变化 ↓ ↓
3、删除操作
同样是1026.
只要将 下标为32的数组元素第2位标记为0就行了。
实现:bitmap[1026/32]=bitmap[1026/32] & ~1(1026%32)。
~:是按位取反操作, 要删除的位为0其他位为1, 这样就不影响其他位了。
①按位取反
4、查询操作:
同样也是1026.
如果你想看这个数是否存在, 就看它对应的位置(32,2)是否标记为1就行。
所以只要 return bitmap[1026/32]&1<<(1026%32);
如果存在返回值为1&#x