【发布时间】:2021-08-31 12:58:54
【问题描述】:
我有一个表示为整数的位掩码。掩码和整数仅限于 32 位整数。
我有兴趣检查给定掩码/整数的集合位的所有子集,但我不知道快速找到这些子集的好方法。
我一直在使用的解决方案是
for(int j = 1; j <= mask; ++j)
{
if(j & mask != 0)
{
// j is a valid subset of mask
}
}
但这需要从j = 1循环到mask,我认为应该有比这更快的解决方案。
还有比这更快的解决方案吗?
我的后续问题是,如果我想将子集限制为固定大小(即固定数量的设置位),是否也有一种简单的方法可以做到这一点?
【问题讨论】:
-
这能回答你的问题吗? Interesting bitmask puzzle in C++
-
@harold 我认为第一个问题是这样,但我必须添加一个有点不同的后续问题,它将子集限制为固定大小。
-
这比较棘手,但可以通过多种方式实现。您是否可以使用特定于平台的按位运算,例如pdep?这会让事情变得更容易(没有那个是可能的,但很麻烦)
-
mask = 0x110,j = 0x011,mask & j = 0x010. -
这里是“Snoobing any Sets”的略微简化(但不是无循环)版本:stackoverflow.com/questions/19069488/…
标签: algorithm language-agnostic bit-manipulation