c++ - 子集相关的位操作

标签 c++ bit-manipulation

我想知道这个位操作意味着什么:

for (int m = 1; m < (1 << n); ++m) {
    for (int s = m; s; s = (s - 1) & m) {
        // ....
    }
}

第一个 for 循环是枚举 n 个元素的所有子集,但是第二个 for 循环意味着什么?

最佳答案

如果s格式为...10000然后s-1...01111 。然后我们&m ,只剩下那些 1在下部,也出现在 m 中。 ( s 的高位保持不变,并与 m 中的相同)。

实际上,我们清除了 s 中设置最少的位。并将所有低位替换为 m 中的位。可以看出,这相当于“在m的设定位内向下计数”。也就是说,如果mk设置位,从 (1<<k)-1 开始倒数并且,对于这 2k 个数字中的每一个,分配其 k位进入 k职位 m已设置位。

或者,如果我们解释 m作为一个位集,它枚举 m 的所有子集(包括 m 但跳过空子集)。

关于c++ - 子集相关的位操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58306315/

相关文章:

c++ - 是否可以创建自己的自定义语言环境

C++/Thrift:TThreadedServer::stop() 是线程安全的吗?

c++ - 如何在 Visual C++ .exe 项目中不创建 .lib 和 .exp 文件

c++ - 编写可以从 C++ 使用的 C 头文件

algorithm - 如何计算32位整数中的设置位数?

python - 当 n 和 x 是整数且 n>=x 时,对于 x 的多少个值,n + x = n 异或 x ?

c++ - 无法启动,因为缺少 cygwin1.dll...目标是没有依赖项

C# .NET : if ((e. State & ListViewItemStates.Selected) != 0) <- 这是什么意思?

java - 通过按位运算将 Unicode 转换为字符

cross-platform - 如何在 Ada 中对 mod 类型执行二进制加法?