当前位置: 首页 > 知识库问答 >
问题:

如何迭代按位掩码的子集?

严永丰
2023-03-14

我有一个表示为整数的按位掩码。掩码和整数限制为32位整数。

for(int j = 1; j <= mask; ++j)
{
  if(j & mask != 0)
  {
    // j is a valid subset of mask
  }
}

有比这更快的解决方案吗?

我的后续问题是,如果我想限制子集的大小(即,固定的设置比特数),有没有一个简单的方法做到这一点?

共有1个答案

白芷阳
2023-03-14

在C++中迭代状态的所有子集:

for (int subset=state; subset>0; subset=(subset-1)&state) {}

这个技巧通常用于位掩码+dp问题。迭代所有状态的所有子集的总时间复杂度为O(3^n),如果使用本题中的代码,这比O(4^n)有了很大的改进。

 类似资料:
  • 问题内容: 我有以下几点: 我想了解如何计算得出以下结果,例如: 12414 我对位掩码的工作原理一无所知,如果有人能给出一些提示并解释它如何达到这个数字,我将不胜感激。 问题答案: 该表达式等效于2的n次幂。 您撰写本文时,只要和相同,就不同。因此,您可以根据需要以简单的添加方式来考虑它。 数以二进制是所以它是下列标志的总和(或按位OR): 请注意,当从右到左读取时,包含的标志对应于在12414

  • 问题内容: 我正在使用PHP的用户角色/权限系统来编写脚本。 下面是使用位掩码方法获得phpbuilder.com权限的代码。 在该部分下面是一个简单得多的版本,w3hich可以在几乎没有该部分的情况下完成相同的操作。 许多人建议使用位运算符,例如PHP中的设置和其他内容,但我从来不明白为什么。在下面的代码中,使用第一个代码而不是第二个代码有什么 好处 ? 非位版本 问题答案: 为什么不这样做呢?

  • 我正在使用Flutter和Cloud FiRecovery构建一个Instagram克隆,我正在尝试像这样构建数据库: 收藏(“时间线”) 实际上看起来像这样: 阅读项目标题,例如,很容易。我可以渲染一个Listview.builder并使用: 但是我如何遍历每个项目的评论子集合?我尝试了嵌套的Listview和this,但我无法访问elementAt(index)的子集合: 或者有没有更好的方法

  • 我试图找到/创建一个位旋转算法,该算法在-bit-count位掩码中生成s的所有

  • 问题内容: 在Apple有关与C API进行交互的文档中,他们描述了将带有标记的C样式枚举作为Swift枚举导入的方式。这是有道理的,并且由于Swift中的枚举很容易作为值类型提供,因此很容易看到如何创建我们自己的枚举。 再往下,它说了关于标记C样式的选项: Swift还会导入标有宏的选项。而选项的行为类似于进口枚举,选项还可以支持一些位操作,如,和。在Objective- C中,您表示一个空的选

  • 我试图了解国际象棋编程中的位板表示是如何工作的,但我找不到关于一个细节的有用信息(或者只是无法正确翻译它^^)。我的问题是,如何自动生成掩码,以便在每个位置上移动每一个棋子。我假设它是一个矩阵,其中每个棋子类型都定义了他可以从该位置移动的每个字段(wP、bP、K、R、N、B的数组[5][64])。例如,对于下面的Rook on位置,只允许位置是: 我假设我必须为每一块类型和每一块瓷砖创建类似的东西