Skip to content

Instantly share code, notes, and snippets.

@DavideCanton
Created September 9, 2013 10:57
Show Gist options
  • Save DavideCanton/6494128 to your computer and use it in GitHub Desktop.
Save DavideCanton/6494128 to your computer and use it in GitHub Desktop.
bitset C++
class dyn_bitset
{
using byte_t = uint_fast8_t;
private:
int _size, _bits;
byte_t* _buf;
public:
dyn_bitset(int n)
: _size((n + 7) >> 3), _bits(n), _buf(new byte_t[_size] { })
{
}
dyn_bitset(const dyn_bitset& b)
: _size(b._size), _bits(b._bits), _buf(new byte_t[_size])
{
copy(b._buf, b._buf + _size, _buf);
}
dyn_bitset(dyn_bitset&& b)
: _size(b._size), _bits(b._bits), _buf(new byte_t[_size])
{
copy(b._buf, b._buf + _size, _buf);
delete[] b._buf;
b._buf = nullptr;
b._size = 0;
b._bits = 0;
}
~dyn_bitset()
{
delete[] _buf;
}
dyn_bitset& operator=(const dyn_bitset& b)
{
delete[] _buf;
_size = b._size;
_buf = new byte_t[_size];
_bits = b._bits;
copy(b._buf, b._buf + _size, _buf);
return *this;
}
dyn_bitset& operator=(dyn_bitset&& b)
{
_size = b._size;
_buf = b._buf;
_bits = b._bits;
b._buf = nullptr;
b._size = 0;
b._bits = 0;
return *this;
}
int size() const
{
return _size;
}
int bits() const
{
return _bits;
}
const bool operator[](int n) const
{
return (_buf[n >> 3] >> (n & 7)) & 1;
}
void set(int n)
{
_buf[n >> 3] |= 1 << (n & 7);
}
void clear(int n)
{
_buf[n >> 3] &= ~(1 << (n & 7));
}
bool operator==(const dyn_bitset& b1) const
{
if (_size != b1._size)
return false;
byte_t *p1 = _buf, *p2 = b1._buf;
for (int i = 0; i < _size; i++, ++p1, ++p2)
if (*p1 != *p2)
return false;
return true;
}
bool operator!=(const dyn_bitset& b1) const
{
return !(*this == b1);
}
string to_string() const
{
ostringstream oss;
int bi = bits();
for (int i = 0; i < bi; i++)
oss << ((*this)[i] ? '1' : '0');
return oss.str();
}
dyn_bitset& operator&=(const dyn_bitset& b)
{
byte_t *p1 = _buf, *p2 = b._buf;
for (int i = 0; i < _size; i++, ++p1, ++p2)
*p1 &= *p2;
return *this;
}
dyn_bitset& operator|=(const dyn_bitset& b)
{
byte_t *p1 = _buf, *p2 = b._buf;
for (int i = 0; i < _size; i++, ++p1, ++p2)
*p1 |= *p2;
return *this;
}
dyn_bitset& operator^=(const dyn_bitset& b)
{
byte_t *p1 = _buf, *p2 = b._buf;
for (int i = 0; i < _size; i++, ++p1, ++p2)
*p1 ^= *p2;
return *this;
}
};
dyn_bitset operator&(dyn_bitset b, const dyn_bitset& b1)
{
return (b &= b1);
}
dyn_bitset operator|(dyn_bitset b, const dyn_bitset& b1)
{
return (b |= b1);
}
dyn_bitset operator^(dyn_bitset b, const dyn_bitset& b1)
{
return (b ^= b1);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment