1.位图只能用于非负数,以位为单位,每个位代表对应的数字,压缩存储,记录每个数字是否出现,先初始化为0,若出现设置为1。如第二位代表数字2,若出现为1,否则为0,但不能记录数字出现了几次。

2.右移>>(向低位移)相当于除以;左移<<(向高位移)相当于乘以;

#include<iostream>
#include<vector>
using namespace std;
class BitMap
{
public:
	BitMap()
		:_size(0)
	{}
	BitMap(int len)
		:_size(len/32+1)
	{
		_array.resize(_size,0);
	}
	void Set(int num)
	{
		 //index确定在哪个大格(一个大格32位)
		size_t index=num>>5;  //等价于除以32(int 类型4*8位),移位效率更高
		//确定在每个大格的哪个小格
		size_t count=num%32;
		//将那位设置为1
		_array[index]|=1<<count;  //等价于_array[index]先向高位移count位,再与1或。移位的优先级高于或运算
		++_size;	
	}
	void Reset(int num)
	{
		//将某位设置为0
		size_t index=num>>5;
		size_t count=num%32;
		_array[index]&=~(1<<count);  //该位和1与,再取反
		--_size;
	}
	//测试该位是否存在
	bool test(int num)
	{
		size_t index=num>>5;
		size_t count=num%32;
		return _array[index]&(1<<count); //该位和1与
	}
	void clear()
	{
		_array.assign(_array.size(),0);
		_size=0;
	}
private:
	vector<int> _array;
	size_t _size;
};
void Test()
{
	BitMap bm(5);
	bm.Set(1);
}
int main()
{
	Test();
	system("pause");
	return 0;
}