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; }