Как определить, установлен ли бит в позиции n в постоянную переменную?
template<std::uint64_t N, std::uint8_t Bit> struct is_bit_set { static bool const value = !!(N & 1u << Bit); };
!! используется для краткого преобразования значения в bool и предотвращения предупреждений компилятора обрезания данных.
!!
bool
int const a = 4; int const bitset = !!((1 << 2) & a);
Теперь bitset равно 1.Было бы 0, если бы вы, например, хранили 3.Да, a является переменной .
bitset
1
0
3
a
То же, что и пользователь ildjarn предлагает в свой ответ , но с так называемым "enum trick" , который гарантирует, что компилятор выполнит все вычисления во время компиляции:
template<std::uint64_t N, std::uint8_t Bit> struct is_bit_set { enum { value = ( N & (1u << Bit) ) != 0 }; };