在C++的STL中实现由一个bitset类模板,其用法如下:
std::bitset bs;
也就是说,这个bs只能支持64位以内的位存储和操作;bs一旦定义就不能动态增长了。本资源附件中实现了一个动态Bitset,和标准bitset兼容。
/** @defgroup Bitset Bitset位集类
* @{
*/
//根据std::bitset改写,函数意义和std::bitset保持一致
class CORE_API Bitset: public Serializable {
typedef typename uint32_t _Ty;
static const int _Bitsperword = (CHAR_BIT * sizeof(_Ty));
_Ty * _Array; //最低位放在[0]位置,每位的默认值为0
int _Bits;//最大有效的Bit个数
private:
int calculateWords()const;
void tidy(_Ty _Wordval = 0);
void trim();
_Ty getWord(size_t _Wpos)const;
public:
//默认构造
Bitset();
//传入最大的位数,每位默认是0
Bitset(int nBits);
virtual ~Bitset();
//直接整数转化成二进制,赋值给Bitset,最高低放在[0]位置
Bitset(unsigned long long _Val);
//拷贝构造函数
Bitset(const Bitset & b);
Bitset(const char * str);
Bitset(const std::string & str, size_t _Pos, size_t _Count);
public:
size_t size()const;
//返回设置为1的位数
size_t count() const;
bool subscript(size_t _Pos) const;
bool get(size_t pos) const;
//设置指定位置为0或1,true表示1,false表示0,如果pos大于数组长度,则自动扩展
void set(size_t _Pos, bool _Val = true);
//将位数组转换成整数,最低位放在[0]位置
//例如数组中存放的1011,则返回13,而不是返回11
unsigned long long to_ullong() const;
bool test(size_t _Pos) const;
bool any() const;
bool none() const;
bool all() const;
std::string to_string() const;
public:
//直接整数转化成二进制,赋值给Bitset,最高位放在[0]位置
Bitset& operator = (const Bitset& b);
//直接整数转化成二进制,赋值给Bitset,最高位放在[0]位置
Bitset& operator = (unsigned long long ull);
//返回指定位置的值,如果pos大于位数组长度,自动拓展
bool operator [] (const size_t pos);
//测试两个Bitset是否相等
bool operator == (const Bitset & b);
bool operator != (const Bitset & b);
Bitset operator<>(size_t _Pos) const;
bool operator > (const Bitset & c)const;
bool operator < (const Bitset & c)const;
Bitset& operator &=(const Bitset& _Right);
Bitset& operator|=(const Bitset& _Right);
Bitset& operator^=(const Bitset& _Right);
Bitset& operator<>=(size_t _Pos);
public:
Bitset& flip(size_t _Pos);
Bitset& flip();
//将高位与低位互相,如数组存放的是1011,则本函数执行后为1101
Bitset& reverse();
//返回左边n位,构成新的Bitset
Bitset left(size_t n) const;
//返回右边n位,构成新的Bitset
Bitset right(size_t n) const;
//判断b包含的位数组是否是本类的位数组的自串,如果是返回开始位置
size_t find (const Bitset & b) const;
size_t find(unsigned long long & b) const;
size_t find(const char * b) const;
size_t find(const std::string & b) const;
//判断本类的位数组是否是b的前缀
bool is_prefix(unsigned long long & b) const;
bool is_prefix(const char * b) const;
bool is_prefix(const std::string & b) const;
bool is_prefix(const Bitset & b) const;
void clear();
void resize(size_t newSize);
void reset(const unsigned char * flags, size_t s);
void reset(unsigned long long _Val);
void reset(const char * _Str);
void reset(const std::string & _Str, size_t _Pos, size_t _Count);
//左移动n位,返回新的Bitset
//extendBits=false "1101" 左移动2位 "0100";
//extendBits=true "1101" 左移动2位 "110100";
Bitset leftShift(size_t n,bool extendBits=false)const;
//右移动n位,返回新的Bitset
//extendBits=false "1101" 右移动2位 "0011";
//extendBits=true "1101" 右移动2位 "001101";
Bitset rightShift(size_t n, bool extendBits = false) const;
public:
virtual uint32_t getByteArraySize();
// returns the size of the required byte array.
virtual void loadFromByteArray(const unsigned char * data);
// load this object using the byte array.
virtual void storeToByteArray(unsigned char ** data, uint32_t& length) ;
// store this object in the byte array.
};
1