k中的k - =(k&( - k))是什么意思?

时间:2018-03-18 19:44:11

标签: c loops

计算此语句遇到的总和的函数..plz help

 int get_sum(int x) {
     int p = 0, k;
     for (k = x; k > 0; k -= k & -k)
         p += bit[k];
     return p;
 }

1 个答案:

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