Обнаружение, если бит установлен (во время компиляции) - PullRequest
3 голосов
/ 15 апреля 2011

Как определить, установлен ли бит в позиции n в постоянную переменную?

Ответы [ 3 ]

6 голосов
/ 15 апреля 2011
template<std::uint64_t N, std::uint8_t Bit>
struct is_bit_set
{
    static bool const value = !!(N & 1u << Bit);
};

!! используется для краткого преобразования значения в bool и предотвращения предупреждений компилятора обрезания данных.

4 голосов
/ 15 апреля 2011
int const a = 4;
int const bitset = !!((1 << 2) & a);

Теперь bitset равно 1.Было бы 0, если бы вы, например, хранили 3.Да, a является переменной .

2 голосов
/ 15 апреля 2011

То же, что и пользователь ildjarn предлагает в свой ответ , но с так называемым "enum trick" , который гарантирует, что компилятор выполнит все вычисления во время компиляции:

template<std::uint64_t N, std::uint8_t Bit>
struct is_bit_set
{
    enum { value = ( N & (1u << Bit) ) != 0 };
};
...