(number) & (-number)是什么意思?我已经搜索过,但是找不到含义

我想在for循环中使用i & (-i):

for (i = 0; i <= n; i += i & (-i))

最佳答案

假设2的补码(或i是无符号的),则-i等于~i+1
i & (~i + 1)是提取i的最低设置位的技巧。

之所以起作用,是因为+1实际上是设置最低的清除位,并清除所有低于该位的位。因此,在i~i+1中设置的唯一位是i中设置的最低位(即~i中的最低清除位)。低于该位的位在~i+1中是清楚的,而高于该位的位在i~i之间不相等。

除非循环主体修改i,否则在循环中使用它似乎很奇怪,因为i = i & (-i)是幂等操作:进行两次将再次获得相同的结果。

[编辑:在其他地方的注释中,您指出该代码实际上是i += i & (-i)。因此,对于非零i来说,执行的操作是清除i的最低置位组,并设置其上的下一个清除位,例如101100->110000。对于i,没有清除位高于最低的置位(包括i = 0),它将i设置为0。因此,如果不是因为i0开始,那么每个循环将i的增加量至少是前一个循环的两倍,有时甚至更多,直到最终超过n和中断或转到0并永远循环。

像这样编写没有注释的代码通常是不可原谅的,但是根据问题的范围,也许这是一个“显而易见的”值序列来循环。]

10-06 05:22