Tob*_*zel 78 c c++ bit-manipulation intrinsics
我目前正在编写一个树枚举器,我遇到了以下问题:
我正在查看屏蔽的位集,即位集,其中设置位是掩码的子集,即0000101
使用掩码1010101
.我想要完成的是增加位集,但仅限于屏蔽位.在这个例子中,结果将是0010000
.为了使它更清晰一点,只提取掩码位,0011
即将0100
它们递增并再次分配给掩码位,给出0010000
.
有没有人看到一种有效的方法来做到这一点,没有使用bitcans和前缀掩码的组合手动实现操作?
zch*_*zch 120
只需将非掩码位填充为1,以便它们传播进位:
// increments x on bits belonging to mask
x = ((x | ~mask) + 1) & mask;
Run Code Online (Sandbox Code Playgroud)
ngl*_*lee 19
虽然与接受的答案相比并不直观,但这只需3个步骤:
x = -(x ^ mask) & mask;
Run Code Online (Sandbox Code Playgroud)
这可以通过zch的建议进行验证:
-(x ^ mask)
= ~(x ^ mask) + 1 // assuming 2's complement
= (x ^ ~mask) + 1
= (x | ~mask) + 1 // since x and ~mask have disjoint set bits
Run Code Online (Sandbox Code Playgroud)
然后它变得等同于接受的答案.
如果迭代的顺序不重要,并且减量操作将满足您的需求,则可以仅使用两个操作:
让我们开始吧
x = mask
并获得以前的价值
x = (x - 1) & mask
x - 1
part将最后一个非零位更改为零,并将所有不太重要的位设置为1.然后& mask
部分只留下掩码位.
归档时间: |
|
查看次数: |
3415 次 |
最近记录: |