我的代码有以下循环:
for (i = A[x]; i < N; i = i | (i + 1))
Run Code Online (Sandbox Code Playgroud)
和,
for (i = A[x]; i >= 0; i = (i & (i + 1)) -1 )
Run Code Online (Sandbox Code Playgroud)
我真的不明白这些更新语句.这些聪明的做事方式是微不足道的吗?
当代码让您感到困惑时,请对其进行实验.
$ cat test.c
#include <stdio.h>
int main(void)
{
for (unsigned int i = 0; i < 256; i = i | (i + 1))
printf(" %04x", i);
putchar('\n');
return 0;
}
$ gcc -std=c99 test.c
$ ./a.out
0000 0001 0003 0007 000f 001f 003f 007f 00ff
Run Code Online (Sandbox Code Playgroud)
因此,混淆you(i = i | (i + 1))的第一个表达式是从底部位向上构造连续的位掩码.
您可以使用相同的技术来确定第二个表达式的作用.