STL中不支持程序运行时设置bitset的位数,下面是我自己实现的一个可动态设定位数的bitset类,位数大小可以由构造函数设置,需要的可以自由改造。
// Example program
// a simple version of dynamic bitset class with the name: bitset_ex
// all rights are NOT reserved by DR. zxg519@sina.com
// 2020-12-28
// a simple version of dynamic bitset class with the name: bitset_ex
// all rights are NOT reserved by DR. zxg519@sina.com
// 2020-12-28
#include < iostream >
#include < string >
#include < cstring >
#include < cassert >
using namespace std;
class bitset_ex
{
public:
{
public:
bitset_ex(const int bit_size1) :bit_size(bit_size1)
{
long_size = (bit_size + (long_bit_size - 1)) / long_bit_size;
data = new long[long_size]();
memset(data, 0, sizeof(long)*long_size);
}
{
long_size = (bit_size + (long_bit_size - 1)) / long_bit_size;
data = new long[long_size]();
memset(data, 0, sizeof(long)*long_size);
}
~bitset_ex()
{
delete [] data;
}
public:
bool test(const int bit_pos) const
{
return data[bit_pos / long_bit_size] & (1 << (bit_pos % long_bit_size));
}
const bool operator[](const int bit_pos) const
{
return data[bit_pos / long_bit_size] & (1 << (bit_pos % long_bit_size));
}
void set(const int bit_pos = -1, const bool set_value = true)
{
if (bit_pos == -1)
{
memset(data, 0XFF, sizeof(long)*long_size);
return;
}
//---------------------------------------------------------------------
if (set_value)
data[bit_pos / long_bit_size] |= (1 << (bit_pos % long_bit_size));
else
data[bit_pos / long_bit_size] &= (~(1 << (bit_pos % long_bit_size)));
}
void reset(const int bit_pos = -1)
{
if (bit_pos == -1) // if bit_pos == -1, reset all bit to zero
{
memset(data, 0, sizeof(long)*long_size);
}
else // otherwise, only set the given bit_pos to zero
{
data[bit_pos / long_bit_size] &= (~(1 << (bit_pos % long_bit_size)));
}
}
void setall()
{
memset(data, 0XFF, sizeof(long)*long_size);
}
void print()
{
bool if_start = false;
for (int i = bit_size - 1; i >= 0; --i)
{
bool test(const int bit_pos) const
{
return data[bit_pos / long_bit_size] & (1 << (bit_pos % long_bit_size));
}
const bool operator[](const int bit_pos) const
{
return data[bit_pos / long_bit_size] & (1 << (bit_pos % long_bit_size));
}
void set(const int bit_pos = -1, const bool set_value = true)
{
if (bit_pos == -1)
{
memset(data, 0XFF, sizeof(long)*long_size);
return;
}
//---------------------------------------------------------------------
if (set_value)
data[bit_pos / long_bit_size] |= (1 << (bit_pos % long_bit_size));
else
data[bit_pos / long_bit_size] &= (~(1 << (bit_pos % long_bit_size)));
}
void reset(const int bit_pos = -1)
{
if (bit_pos == -1) // if bit_pos == -1, reset all bit to zero
{
memset(data, 0, sizeof(long)*long_size);
}
else // otherwise, only set the given bit_pos to zero
{
data[bit_pos / long_bit_size] &= (~(1 << (bit_pos % long_bit_size)));
}
}
void setall()
{
memset(data, 0XFF, sizeof(long)*long_size);
}
void print()
{
bool if_start = false;
for (int i = bit_size - 1; i >= 0; --i)
{