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的定义及其存储的内容。