Created
September 9, 2013 10:57
-
-
Save DavideCanton/6494128 to your computer and use it in GitHub Desktop.
bitset C++
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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