#include <iostream> #include <memory.h> #include <memory> using namespace std; /* * // 0000 0000 八个bit位,每一位标志一个数是否存在 * unsigned char bit_table[8]{1, 2, 4, 8, 16, 32, 64, 128}; * * unsigned char c = 0; * c |= bit_table[3]; // 将c的第3个(右7<-左0)bit为置为1,用以标志3的存在 */ namespace yudw { class unsigned_int_bitmap { public: unsigned_int_bitmap() { const unsigned int max_unsigned_int = 0xffffffff; const unsigned int n_map_size = max_unsigned_int / 8 + (max_unsigned_int % 8 == 0 ? 0 : 1); bit_map = new char[n_map_size]; memset(bit_map, 0, n_map_size); } ~unsigned_int_bitmap(){delete[] bit_map; } void store(unsigned int num) { unsigned int bit_map_index = num / 8; unsigned int bit_index = num % 8; bit_map[bit_map_index] |= bit_table[bit_index]; // bit位置1次数标志存在 } bool load(unsigned int num) { unsigned int bit_map_index = num / 8; unsigned int bit_index = num % 8; return bit_map[bit_map_index] & bit_table[bit_index]; // 我们只需要看一下对应的bit位有没有被置1 } private: char* bit_map; //每一个bit_map元素可以用它的8个bit位标记8个数字是否存在 unsigned char bit_table[8]{1, 2, 4, 8, 16, 32, 64, 128}; // 一个数num |= bit_table[i], 则第i个bit(左7<-左0)为被置为1 }; } int main() { unsigned int a[]{1, 23, 43, 34, 5, 22, 54, 92, 908, 888888}; unsigned int b[]{1, 23, 43, 34, 5, 22, 54, 92, 908, 22222}; yudw::unsigned_int_bitmap bitmap; for(int i =0; i < 10; ++i) { bitmap.store(a[i]); } for(int i=0; i < 10; ++i) { cout<<bitmap.load(b[i])<<' '; } return 0; }
运行结果: