#include <iostream>
#include <bitset>
template <size_t N>
class twoBit
{
typedef typename std::bitset<2*N>::reference bitRef;
bitRef a, b;
public:
twoBit(bitRef a1, bitRef b1): a(a1), b(b1) {};
const twoBit &operator=(int i) { a = i%2; b = i/2; return *this; };
operator int() { return 2*b + a; };
};
template <size_t N>
class twoBitSet : private std::bitset<2*N>
{
typedef typename std::bitset<2*N>::reference bitRef;
public:
twoBit<N> operator[](int index)
{
bitRef b1 = std::bitset<2*N>::operator[](2*index);
bitRef b2 = std::bitset<2*N>::operator[](2*index + 1);
return twoBit<N>(b1, b2);
};
};
int main()
{
twoBitSet<32> bs;
bs[0] = 2;
bs[1] = 3;
bs[2] = 1;
bs[3] = 0;
std::cout << bs[0] << std::endl; // prints 2
std::cout << bs[1] << std::endl; // prints 3
std::cout << bs[2] << std::endl; // prints 1
std::cout << bs[3] << std::endl; // prints 0
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Yml0c2V0PgoKdGVtcGxhdGUgPHNpemVfdCBOPiAKY2xhc3MgdHdvQml0CnsKICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6Yml0c2V0PDIqTj46OnJlZmVyZW5jZSBiaXRSZWY7CiAgYml0UmVmIGEsIGI7CnB1YmxpYzoKICB0d29CaXQoYml0UmVmIGExLCBiaXRSZWYgYjEpOiBhKGExKSwgYihiMSkge307CiAgY29uc3QgdHdvQml0ICZvcGVyYXRvcj0oaW50IGkpIHsgYSA9IGklMjsgYiA9IGkvMjsgcmV0dXJuICp0aGlzOyB9OwogIG9wZXJhdG9yIGludCgpIHsgcmV0dXJuIDIqYiArIGE7IH07Cn07Cgp0ZW1wbGF0ZSA8c2l6ZV90IE4+IApjbGFzcyB0d29CaXRTZXQgOiBwcml2YXRlIHN0ZDo6Yml0c2V0PDIqTj4KewogIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpiaXRzZXQ8MipOPjo6cmVmZXJlbmNlIGJpdFJlZjsKcHVibGljOgogIHR3b0JpdDxOPiBvcGVyYXRvcltdKGludCBpbmRleCkKICB7CiAgICBiaXRSZWYgYjEgPSBzdGQ6OmJpdHNldDwyKk4+OjpvcGVyYXRvcltdKDIqaW5kZXgpOwogICAgYml0UmVmIGIyID0gc3RkOjpiaXRzZXQ8MipOPjo6b3BlcmF0b3JbXSgyKmluZGV4ICsgMSk7CiAgICByZXR1cm4gdHdvQml0PE4+KGIxLCBiMik7CiAgfTsKfTsKCmludCBtYWluKCkKewogICAgdHdvQml0U2V0PDMyPiBiczsKICAgIGJzWzBdID0gMjsKICAgIGJzWzFdID0gMzsKICAgIGJzWzJdID0gMTsKICAgIGJzWzNdID0gMDsKICAgIHN0ZDo6Y291dCA8PCBic1swXSA8PCBzdGQ6OmVuZGw7IC8vIHByaW50cyAyCiAgICBzdGQ6OmNvdXQgPDwgYnNbMV0gPDwgc3RkOjplbmRsOyAvLyBwcmludHMgMwogICAgc3RkOjpjb3V0IDw8IGJzWzJdIDw8IHN0ZDo6ZW5kbDsgLy8gcHJpbnRzIDEKICAgIHN0ZDo6Y291dCA8PCBic1szXSA8PCBzdGQ6OmVuZGw7IC8vIHByaW50cyAwCn0=