#include <climits>
#include <iostream>
#include <cassert>
template<int S> struct boolset {
static int const SIZE = ((S / CHAR_BIT) + (0 != (S % CHAR_BIT)));
unsigned char m_bits[SIZE];
public:
boolset() : m_bits() { for(int i = 0; i < SIZE; ++i) m_bits[i] = 0; }
bool get(int i) const {
assert(i < S);
return (m_bits[i / CHAR_BIT] & (1 << (i % CHAR_BIT)));
}
void set(int i, bool v) {
assert(i < S);
if(v) { m_bits[i / CHAR_BIT] |= (1 << (i % CHAR_BIT)); }
else { m_bits[i / CHAR_BIT] &= ~(1 << (i % CHAR_BIT)); }
}
void print(std::ostream & s) const {
for(int i = 0; i < S; ++i) {
s << get(i);
}
}
};
int main(int argc, char ** argv) {
std::cout << sizeof(boolset<1>) << std::endl;
std::cout << sizeof(boolset<8>) << std::endl;
std::cout << sizeof(boolset<9>) << std::endl;
std::cout << sizeof(boolset<16>) << std::endl;
std::cout << sizeof(boolset<17>) << std::endl;
std::cout << sizeof(boolset<32>) << std::endl;
std::cout << sizeof(boolset<33>) << std::endl;
std::cout << sizeof(boolset<64>) << std::endl;
std::cout << sizeof(boolset<129>) << std::endl;
std::cout << std::endl;
boolset<31> bs;
bs.set(0, true);
bs.set(28, true);
bs.set(2, true);
std::cout << bs.get(28) << std::endl;
bs.print(std::cout); std::cout << std::endl;
bs.set(2, false);
bs.print(std::cout); std::cout << std::endl;
}
I2luY2x1ZGUgPGNsaW1pdHM+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPGNhc3NlcnQ+Cgp0ZW1wbGF0ZTxpbnQgUz4gc3RydWN0IGJvb2xzZXQgewogICAgc3RhdGljIGludCBjb25zdCBTSVpFID0gKChTIC8gQ0hBUl9CSVQpICsgKDAgIT0gKFMgJSBDSEFSX0JJVCkpKTsKCXVuc2lnbmVkIGNoYXIgbV9iaXRzW1NJWkVdOwpwdWJsaWM6Cglib29sc2V0KCkgOiBtX2JpdHMoKSB7IGZvcihpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpIG1fYml0c1tpXSA9IDA7IH0KCglib29sIGdldChpbnQgaSkgY29uc3QgewoJCWFzc2VydChpIDwgUyk7CgkJcmV0dXJuIChtX2JpdHNbaSAvIENIQVJfQklUXSAmICgxIDw8IChpICUgQ0hBUl9CSVQpKSk7Cgl9CgoJdm9pZCBzZXQoaW50IGksIGJvb2wgdikgewoJCWFzc2VydChpIDwgUyk7CgkJaWYodikgeyBtX2JpdHNbaSAvIENIQVJfQklUXSB8PSAoMSA8PCAoaSAlIENIQVJfQklUKSk7IH0KCQllbHNlIHsgbV9iaXRzW2kgLyBDSEFSX0JJVF0gJj0gfigxIDw8IChpICUgQ0hBUl9CSVQpKTsgfQoJfQoKCXZvaWQgcHJpbnQoc3RkOjpvc3RyZWFtICYgcykgY29uc3QgewoJCWZvcihpbnQgaSA9IDA7IGkgPCBTOyArK2kpIHsKCQkJcyA8PCBnZXQoaSk7CgkJfQoJfQp9OwoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiogYXJndikgewoJc3RkOjpjb3V0IDw8IHNpemVvZihib29sc2V0PDE+KSA8PCBzdGQ6OmVuZGw7CglzdGQ6OmNvdXQgPDwgc2l6ZW9mKGJvb2xzZXQ8OD4pIDw8IHN0ZDo6ZW5kbDsKCXN0ZDo6Y291dCA8PCBzaXplb2YoYm9vbHNldDw5PikgPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8IHNpemVvZihib29sc2V0PDE2PikgPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8IHNpemVvZihib29sc2V0PDE3PikgPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8IHNpemVvZihib29sc2V0PDMyPikgPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8IHNpemVvZihib29sc2V0PDMzPikgPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8IHNpemVvZihib29sc2V0PDY0PikgPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8IHNpemVvZihib29sc2V0PDEyOT4pIDw8IHN0ZDo6ZW5kbDsKCXN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7Cglib29sc2V0PDMxPiBiczsKCWJzLnNldCgwLCB0cnVlKTsKCWJzLnNldCgyOCwgdHJ1ZSk7Cglicy5zZXQoMiwgdHJ1ZSk7CglzdGQ6OmNvdXQgPDwgYnMuZ2V0KDI4KSA8PCBzdGQ6OmVuZGw7Cglicy5wcmludChzdGQ6OmNvdXQpOyBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwoJYnMuc2V0KDIsIGZhbHNlKTsKCWJzLnByaW50KHN0ZDo6Y291dCk7IHN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7Cn0=