(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。因此,如果不是因为i
从0
开始,那么每个循环将i
的增加量至少是前一个循环的两倍,有时甚至更多,直到最终超过n
和中断或转到0
并永远循环。
像这样编写没有注释的代码通常是不可原谅的,但是根据问题的范围,也许这是一个“显而易见的”值序列来循环。]