【问题标题】:Counting bits in a int - why does this code work?计算 int 中的位 - 为什么此代码有效?
【发布时间】:2011-04-24 02:19:39
【问题描述】:

我想了解更多关于比特的信息,结果发现了this example

这段代码如何计算位数? (顺便说一句,我的 C 很生锈)。

unsigned int v; // count the number of bits set in v
unsigned int c; // c accumulates the total bits set in v

for (c = 0; v; v >>= 1)
{
  c += v & 1;
}

【问题讨论】:

  • 这不是代码审查平台。请在代码审查部分执行此操作。有非常好的和更有效的解决方案来计算其他问题中的位,例如这里:stackoverflow.com/questions/109023/…

标签: c binary integer bit


【解决方案1】:

v & 1 如果设置了v 的最低位,则为 1,否则为 0。

循环不断将vright 的位每次迭代除以1,因此v 的最低位循环覆盖原始v 中的每个位(因为每个位都变为1放在“脱落”小数末端之前)。

因此,它遍历每个位,如果已设置则将 c 加 1,如果未设置则加 0,从而总计原始 v 中设置的位。

例如,以1011 开头的v

  1. 1011 & 1 = 1,所以 c 递增到 1。
  2. 然后1011 变为101
  3. 101 & 1 = 1,所以 c 递增到 2。
  4. 101 转换为 10
  5. 10 & 1 = 0,所以 c 不递增,保持为 2。
  6. 10 转换为 1
  7. 1 & 1 = 1,所以 c 递增到 3。
  8. 1 被移动为 0(因为最后一位从小数末尾掉了下来)。
  9. 由于for 循环的条件只是v,而v 现在是0,这是一个假值,循环停止。

最终结果,c = 3,如我们所愿。

【讨论】:

  • 我最喜欢你的回答:-)
【解决方案2】:

基本上,您将v 的 1 位与值 1 进行比较,并且您知道 AND 的真值表。

  • 1 & 0 = 0
  • 0 & 1 = 0
  • 1 & 1 = 1

所以如果来自v 的位为1,如果与1 与运算将产生1。然后将v 移动1 位并继续。

【讨论】:

    【解决方案3】:

    v & 基本上提取了v 的最低有效位——如果该位已设置,则为1,否则为0。循环中的每次迭代它都会向右移动v 1 个位置。在每次迭代中,它将v & 测试的结果添加到计数器c。因此,设置的每一位都意味着添加了1;添加每个清除位0

    【讨论】:

      【解决方案4】:

      v >>= 1 将继续移动最低有效位,直到 v 全为零。所以我们在把它们都数完之前不要停下来。 v&1 测试我们将要移出的位是否为 1,因此我们确保在移出之前对其进行计数。

      【讨论】:

        猜你喜欢
        • 2017-06-04
        • 1970-01-01
        • 1970-01-01
        • 2021-07-05
        • 1970-01-01
        • 2011-09-09
        • 2022-10-07
        • 1970-01-01
        • 2012-08-25
        相关资源
        最近更新 更多