我正在博客上阅读一个问题,问题的解决方案是检查“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;
我不确定这里发生了什么。 有人可以帮我理解这个吗?
答案 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
)。