Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- using namespace std;
- template<int nbits>
- class BitField
- {
- static constexpr unsigned int size = (nbits + 7)/8;
- unsigned char data[ size ];
- struct setter
- {
- BitField & bf;
- int i;
- setter(BitField & bf, int i):bf(bf),i(i){}
- setter operator<<(bool bit)
- {
- bf.setBit(i, bit);
- setter bs(bf, i+1);
- return bs;
- }
- };
- public:
- static const int bits = nbits;
- BitField():data{0} {
- cout << size << endl;
- }
- void setBit(int i, bool value)
- {
- const int p1 = i/8;
- const int p2 = i%8;
- // clear
- data[p1] &= ~(1 << p2);
- // set
- data[p1] |= value << p2;
- }
- bool bit(int i) const
- {
- return data[i/8] & (1 << (i%8));
- }
- setter operator<<(bool bit)
- {
- setter bs(*this, 0);
- return bs << bit;
- }
- setter set(int i)
- {
- setter bs(*this, i);
- return bs;
- }
- };
- int main()
- {
- BitField<8> a, b;
- a << 1 << 0 << 1 << 0 << 1 << 1 << 0 << 0;
- a.set(4) << 0 << 1 << 0 << 1;
- for(int i=0; i<a.bits; ++i)
- {
- cout << a.bit(i) << " ";
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment