#include<cassert>#include<iostream>using namespace std;#define INT_BIT sizeof(int)#define MAX 1024*1024*1024#define SHIFT 5#define UNIT INT_BIT << 3 // INT_BIT * 2^3#define MASK 0x1fclass BitSet{ public: BitSet(int maxSize = MAX) :_msize(maxSize) { pBitset = new int[_msize / UNIT + 1]; } ~BitSet() { if (pBitset){ delete[] pBitset; } } void set(int i) { assert(i<_msize); // i >> SHIFT = i / (2^5) // i & MASK = i % int j = i; if (j>UNIT){ j >>= SHIFT; } pBitset[j] |= 1 << (i & MASK); } void clear(int i) { assert(i<_msize); int j = i; if (j>UNIT){ j >>= SHIFT; } pBitset[j] &= ~(1 << (i & MASK)); } bool test(int i) { assert(i<_msize); int j = i; if (j>UNIT){ j >>= SHIFT; } return (pBitset[j] & (1 << (i & MASK))); }private: int _msize; int *pBitset;};
4. 測試代碼
int main(){ BitSet bitset(100); int i = 80; bitset.set(i); if (bitset.test(i)){ cout << "the pos " << i << " is seted" << endl; } else{ cout << "the pos " << i << " is not seted" << endl; } bitset.clear(i); if (bitset.test(i)){ cout << "the pos " << i << " is seted" << endl; } else{ cout << "the pos " << i << " is not seted" << endl; }}