c - 这个方法如何统计二进制表示中的1个数?

标签 c algorithm bit-manipulation

<分区>

Possible Duplicate:
n & (n-1) what does this expression do?

考虑以下算法:

int count(int num)
{
  int ones = 0;
  while(num)
  {
    ++ones; 
    num &= num - 1;
  }

  return ones;
}

num & (num-1)有什么意义?它是如何工作的?

最佳答案

num &= num - 1;

清除 num 中设置的最低有效位。

该算法通过清除它们并递增计数器直到它们全部消失来对设置的位进行计数。

要理解为什么它会清除最低有效位,您需要考虑递减对这些位的作用,当然还要理解 & 操作的作用。

二进制减法就像我们小时候教的十进制一样。 您从右(最低有效位)到左工作,尽可能简单地减去单个数字,并在必要时从下一个数字“借用”。

当从以一组零结尾的二进制数中减 1 时,这种“借用”和减法会将比最右边的 1 低位的所有零变为 1,并将最右边的 1 变为零(因为它是借来的) .

然后应用 & 运算符将所有较小的数字保留为零,因为它们在 num 中为零,并设置 num 的最低有效位> 为零,因为它在 num-1 中为零。

这两个操作都保持较高有效数字不变。

这是一个很好的列表 bit twiddling hacks包括这个,这是由于 Brian Kernighan .

关于c - 这个方法如何统计二进制表示中的1个数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11810507/

相关文章:

algorithm - 在没有循环的情况下计算给定数字的负二进制表示

sql - SQL 中的管道运算符有什么作用?

c - Linux C socket服务器printf问题

c - PSL1GHT 中的 3d 图形

C 字符串裁剪运行时错误

给定两个坐标计算矩阵中最快距离的 Pythonic 方法?

algorithm - 背包 0-1 数量固定

android - 内核到用户空间应用程序通信

algorithm - 减少简单排序数组的内存开销

c - 在 C 中使用位字段时的字段顺序