首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c中的k-=(k & (-k))是什么意思?

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

Stack Overflow用户
提问于 2018-03-19 03:44:11
回答 1查看 455关注 0票数 1

一个计算sum的函数,我在使用此语句时遇到了..plz帮助

代码语言:javascript
复制
 int get_sum(int x) {
     int p = 0, k;
     for (k = x; k > 0; k -= k & -k)
         p += bit[k];
     return p;
 }
EN

回答 1

Stack Overflow用户

发布于 2018-03-19 09:54:27

此表达式:

代码语言:javascript
复制
k -= (k & (-k))

是一种获取设置为正数的最低有效位并清除该位的巧妙方法。它依赖于两个负数的互补表示。

第一部分,k & (-k)隔离设置的最低有效位。例如:

1 & -1

代码语言:javascript
复制
   00000001
 & 11111111
   --------
   00000001

2 & -2

代码语言:javascript
复制
   00000010
 & 11111110
   --------
   00000010

24 & -24

代码语言:javascript
复制
   00011000
 & 11101000
   --------
   00001000

从原始k中减去此值后,其结果是清除该位。

因此,随着循环的进行,k的值一次减少1位,从最低位开始。例如,如果x是52,那么k将是52,然后是48 (52 - 4),然后是32 (48 - 16),并且将在0 (32 - 32)处退出。

至于程序为什么要这样做,这完全取决于bit的定义和它存储的内容。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49352148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档