检查是否设置了1到n之间的k中的所有位

时间:2011-09-04 18:00:00

标签: c++ bit-manipulation

我正在博客上阅读一个问题,问题的解决方案是检查“k”中的1到n位是否设置。

对于前。

  • k = 3且n = 2;然后是“真”,因为第1和第2位在k

  • 中设置
  • k = 3且n = 3;然后“假”,因为k中的第3位未设置

作者提供的解决方案是:

    if (((1 << (n-1)) ^ (k & ((1 << n)-1))) == ((1 << (n-1))-1))
        std::cout<<"true"<<std::endl; 
    else 
        std::cout<<"false"<<std::endl; 

我不确定这里发生了什么。 有人可以帮我理解这个吗?

1 个答案:

答案 0 :(得分:10)

如果您在笔和纸上绘制二进制表示,您会看到(1 << (n-1))始终将单个位设置为1(n - 位),而(1 << n) - 1设置第一个n位。

这些是bitmasks;它们被用于通过按位运算(k&|)来操纵输入的某些部分(^)。

注意

我认为这个例子是不必要的复杂。这应该足够了:

if ((k & ((1 << n) - 1)) == ((1 << n) - 1))
    ...

或者使它更清洁:

unsigned int mask = (1 << n) - 1;
if ((k & mask) == mask)
   ...

(假设k的类型为unsigned int)。