k中的k – =(k&( – k))是什么意思?
一个函数来计算我在这个语句中遇到的总和..plz帮助
int get_sum(int x) { int p = 0, k; for (k = x; k > 0; k -= k & -k) p += bit[k]; return p; }
这个表达式:
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
的定义及其存储的内容。