隐秘的for循环更新语句

fus*_*sha 3 c idioms

我的代码有以下循环:

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)

我真的不明白这些更新语句.这些聪明的做事方式是微不足道的吗?

zwo*_*wol 6

当代码让您感到困惑时,请对其进行实验.

$ 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))的第一个表达式是从底部位向上构造连续的位掩码.

您可以使用相同的技术来确定第二个表达式的作用.