#include <cstdint>
#include <iostream>
#include <string>
template<uint8_t Bit>
struct set {
static_assert(Bit < 8);
static constexpr uint8_t bit = Bit;
static constexpr bool isNeg = false;
};
template<uint8_t Bit>
struct unset {
static_assert(Bit < 8);
static constexpr uint8_t bit = Bit;
static constexpr bool isNeg = true;
};
template<typename bit, typename... bits>
constexpr uint8_t gen_mask(uint8_t value, uint8_t last_result) {
uint8_t result = 0;
if(bit::isNeg ^ ((value & (1 << bit::bit)) == 0)) {
result = last_result | (1 << bit::bit);
} else {
result = last_result & ~(1 << bit::bit);
}
if constexpr(sizeof...(bits) == 0) {
return result;
} else {
return gen_mask<bits...>(value, result);
}
}
template<typename... bits>
constexpr uint8_t gen_mask(uint8_t value) { return gen_mask<bits...>(value, 0); }
int main() {
uint8_t value = 0b00001111;
uint8_t mask = gen_mask<set<3>, set<5>, set<6>, unset<0>, unset<7>>(value);
uint8_t result = value ^ mask;
std::cout << std::to_string(value) << std::endl;
std::cout << std::to_string(mask) << std::endl;
std::cout << std::to_string(result) << std::endl;
}
I2luY2x1ZGUgPGNzdGRpbnQ+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHN0cmluZz4KCnRlbXBsYXRlPHVpbnQ4X3QgQml0PgpzdHJ1Y3Qgc2V0IHsKCXN0YXRpY19hc3NlcnQoQml0IDwgOCk7CglzdGF0aWMgY29uc3RleHByIHVpbnQ4X3QgYml0ID0gQml0OwoJc3RhdGljIGNvbnN0ZXhwciBib29sIGlzTmVnID0gZmFsc2U7Cn07Cgp0ZW1wbGF0ZTx1aW50OF90IEJpdD4Kc3RydWN0IHVuc2V0IHsKCXN0YXRpY19hc3NlcnQoQml0IDwgOCk7CglzdGF0aWMgY29uc3RleHByIHVpbnQ4X3QgYml0ID0gQml0OwoJc3RhdGljIGNvbnN0ZXhwciBib29sIGlzTmVnID0gdHJ1ZTsKfTsKCnRlbXBsYXRlPHR5cGVuYW1lIGJpdCwgdHlwZW5hbWUuLi4gYml0cz4KY29uc3RleHByIHVpbnQ4X3QgZ2VuX21hc2sodWludDhfdCB2YWx1ZSwgdWludDhfdCBsYXN0X3Jlc3VsdCkgewoJdWludDhfdCByZXN1bHQgPSAwOwoJaWYoYml0Ojppc05lZyBeICgodmFsdWUgJiAoMSA8PCBiaXQ6OmJpdCkpID09IDApKSB7CgkJcmVzdWx0ID0gbGFzdF9yZXN1bHQgfCAoMSA8PCBiaXQ6OmJpdCk7Cgl9IGVsc2UgewoJCXJlc3VsdCA9IGxhc3RfcmVzdWx0ICYgfigxIDw8IGJpdDo6Yml0KTsKCX0KCWlmIGNvbnN0ZXhwcihzaXplb2YuLi4oYml0cykgPT0gMCkgewoJCXJldHVybiByZXN1bHQ7Cgl9IGVsc2UgewoJCXJldHVybiBnZW5fbWFzazxiaXRzLi4uPih2YWx1ZSwgcmVzdWx0KTsKCX0KfQoKdGVtcGxhdGU8dHlwZW5hbWUuLi4gYml0cz4KY29uc3RleHByIHVpbnQ4X3QgZ2VuX21hc2sodWludDhfdCB2YWx1ZSkgeyByZXR1cm4gZ2VuX21hc2s8Yml0cy4uLj4odmFsdWUsIDApOyB9CgoKaW50IG1haW4oKSB7Cgl1aW50OF90IHZhbHVlID0gMGIwMDAwMTExMTsKCXVpbnQ4X3QgbWFzayA9IGdlbl9tYXNrPHNldDwzPiwgc2V0PDU+LCBzZXQ8Nj4sIHVuc2V0PDA+LCB1bnNldDw3Pj4odmFsdWUpOwoJdWludDhfdCByZXN1bHQgPSB2YWx1ZSBeIG1hc2s7CglzdGQ6OmNvdXQgPDwgc3RkOjp0b19zdHJpbmcodmFsdWUpIDw8IHN0ZDo6ZW5kbDsKCXN0ZDo6Y291dCA8PCBzdGQ6OnRvX3N0cmluZyhtYXNrKSA8PCBzdGQ6OmVuZGw7CglzdGQ6OmNvdXQgPDwgc3RkOjp0b19zdHJpbmcocmVzdWx0KSA8PCBzdGQ6OmVuZGw7Cn0=