计算此语句遇到的总和的函数..plz help
int get_sum(int x) {
int p = 0, k;
for (k = x; k > 0; k -= k & -k)
p += bit[k];
return p;
}
答案 0 :(得分:4)
这个表达式:
k -= (k & (-k))
采用以正数设置的最低有效位并清除该位是一种棘手的方法。它取决于负数的两个恭维表示。
第一部分k & (-k)
隔离了设置的最低有效位。例如:
1 & -1
:
00000001
& 11111111
--------
00000001
2 & -2
:
00000010
& 11111110
--------
00000010
24 & -24
:
00011000
& 11101000
--------
00001000
当从orignal k
中减去此值时,它会清除该位。
随着循环的进行,k
的值一次减少1位,从最低位开始。因此,如果例如x
为52,则k
将为52,然后是48(52 - 4),然后是32(48 - 16),并且将在0(32 - 32)处退出。
至于程序为什么这样做,这完全取决于bit
的定义及其存储的内容。