bit-manipulation - 如何工作搜索 sebset 算法
问题描述
当我学习解决问题时,我遇到了一个怪物
int b = 0;
int x = (1<<6)|(1<<5)|(1<<2)
do {
// process subset
} while((b=(b-x)&x));
我知道结果,但我无法理解这段代码。
“(bx)&b”是什么意思?
你是怎么做的?
解决方案
这是增加整数但仅使用位的子集的技巧,即x
.
“(bx)&b”是什么意思?
这是错误的,它是(b - x) & x
。
这个技巧的关键是减法,因此请确保您了解减法的作用。例如,考虑它的一种方法是,从 lsb 到 msb,从被减数的第 i 位减去减数的第 i 位和最后一次迭代的借位,得到第 i 位差额和下一次借。
x
和b
的形式b
只能设置也设置在 中x
的位,这在开始时是正确的,并且由于& x
.
给出这些形式,x
然后b
我们知道每当产生借位时,它“向上流动”通过位,至少直到下一个设置位的位置(在原点之间x
不能有设置位)b
借用和那里,因为只有在设置了 inb
时才能设置 bit in x
)。因此,借位将一直到应该受到影响的下一位,并“跳过”其间所有额外的零。
借来的额外零也通过减法变成一,但& x
又将所有这些变成零。
另一种写这个的方法,可能更容易考虑,是((b | ~x) + 1) & x
. 原理相同,但有补充:“要忽略的位”由 设置| ~x
,然后+1
可以在必要时通过“间隙”。这种方法需要额外的操作,因为它需要用 1 而不是用 0 填充间隙,基于减法的技巧直接适用于所需的格式。
推荐阅读
- dialogflow-es - 如何获取用户在电报聊天机器人中共享的对话流侧电话号码
- c# - Systemd 服务在作为服务启动时使用我的 CPU 的 100%,如果我在没有 systemd 的情况下启动它则不会
- python - 为什么在我的猜谜游戏中数字返回高或低不正确
- python - 概括使用 numpy.meshgrid
- python - 所有 v4 请求都给出错误代码 403(禁止)
- javascript - 是否可以使用 HTML、CSS 和 Javascript 来创建可以访问 Iphone 蓝牙配对的 Iphone 应用程序?
- c# - 如何在我的机器人项目中解析包含来自 Microsoft QnA Maker 的转义序列的问题?
- css - 自动反应导入文件并导致构建错误?
- node.js - 无法使用 Node.js、mssql 和 express 连接到 Microsoft SQL Server
- azure - 天蓝色 blob 下载任务问题