检测是否设置了一个位(在编译时)

时间:2011-04-15 11:31:06

标签: c++ compile-time

如何检测位置n的位是否设置为常量变量?

3 个答案:

答案 0 :(得分:6)

template<std::uint64_t N, std::uint8_t Bit>
struct is_bit_set
{
    static bool const value = !!(N & 1u << Bit);
};

!!用于简洁地将值强制转换为bool并避免数据截断编译器警告。

答案 1 :(得分:4)

int const a = 4;
int const bitset = !!((1 << 2) & a);

现在,bitset1。如果您存储0,则为3。是的,a变量

答案 2 :(得分:2)

user ildjarn中的his answer相同,但所谓的"enum trick"可以保证编译器在编译时完成所有计算:

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