tes*_*123 3 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;
Run Code Online (Sandbox Code Playgroud)
我不确定这里发生了什么.有人可以帮我理解这个吗?
Oli*_*rth 10
如果您在笔和纸上绘制二进制表示,您将看到(1 << (n-1))始终将单个位设置为1(n第 - 位),而(1 << n) - 1设置第一位n.
这些是位掩码 ; 它们被用来k通过按位运算(&,|和^)来操作input()的某些部分.
注意
我认为这个例子是不必要的复杂.这应该足够了:
if ((k & ((1 << n) - 1)) == ((1 << n) - 1))
...
Run Code Online (Sandbox Code Playgroud)
或者使它更清洁:
unsigned int mask = (1 << n) - 1;
if ((k & mask) == mask)
...
Run Code Online (Sandbox Code Playgroud)
(假设k是类型unsigned int).
| 归档时间: |
|
| 查看次数: |
2011 次 |
| 最近记录: |