无法理解部分代码(位操作)

Having trouble understanding a portion of code (bit operation)

我不明白如何计算二进制表示中 1 的个数。

我有我的代码,希望有人能帮我解释一下。

代码:

int count (int x)
{
    int nr=0;
    while(x != 0)
    {
        nr+=x%2;
        x/=2;
    }
    return nr;
}
  1. 为什么要 while?例如,如果我有 1011,它不会停在 0?

  2. 为什么nr += x%2

  3. 为什么 x/=2 ?!

第一个:

nr += x % 2;

想象一下二进制的 x:

...1001101

模运算符 returns 来自 a / b 的余数。

现在 x 的最后一位要么是 0,在这种情况下 2 总是以 0 余数进入 x,要么是 1,在这种情况下它 return 是 1。

如您所见,x % 2 将 return(如果最后一位是 1)为 1,从而将 nr 递增 1,或者不递增,在这种情况下 nr 不变。

x /= 2;

这会将 x 除以二,并且因为它是整数,所以舍去余数。这意味着二进制文件是

....10

它将找出 2 进入其中的次数,在本例中为 1。它有效地删除了二进制数的最后一位,因为在基数 2(二进制)中,2 进入数字的次数是与 'shifting' 下的所有内容一样 space (这是一个糟糕的解释,请询问是否需要详细说明)。这有效地 'iterates' 通过了二进制数,允许行即将检查下一位。

这将迭代直到二进制只是 1,然后减半,舍弃余数,x 将等于 0,

while (x != 0)

在这种情况下退出循环,你已经检查了每一点。

还有:

'count` 可能不是最能描述函数的名称,请考虑将其命名为更能描述其用途的名称。

nr 将始终是大于或等于零的整数,因此您可能应该具有 return 类型 unsigned int

int count (int x)
{
    int nr=0;
    while(x != 0)
    {
        nr+=x%2;
        x/=2;
    }
    return nr;
}

这个程序基本上给出了给定整数中设置位的数量。

例如,让我们从示例整数 11(二进制表示 - 1011)开始。 第一个流程将进入 while 循环并检查数字是否为零。 while(11 != 0)

因为 11 不等于零,所以它进入 while 循环并且 nr 被赋值为 1 (11%2 = 1)。nr += 11%2; 然后它执行循环内的第二行 (x = x/2)。这行代码将值 5 (11/2 = 5 ) 赋值给 x.

一旦完成 while 循环体,它就会再次检查 x 是否等于 5,即 5 是否等于 0。 while( 5 != 0)。 由于情况并非如此,因此流程第二次进入 while 循环,并且 nr 被分配了值 2 ( 1+ 5%2)。 之后 x 的值除以 2 (x/2, 5/2 = 2 ) 并将 2 赋值给 x。 同样在下一个循环中,while (2 != 0 )nr加上(2 + 2%2),因为2%2为0,所以nr的值仍然是2,x的值在下一行减少到 1 (2/2)。 1不等于0所以第三次进入while循环

在 while 循环的第三次执行中 nr 值增加到 3 (2 + 1%2)。 之后 x 的值减少到 0 ( x = 1/2 which is 0).

由于未通过检查 (while x != 0),流程退出循环。

最后 nr 的值(给定整数中设置的位数)返回给调用函数。

了解程序流程的最佳方式是通过调试器执行程序。我强烈建议你通过一个debugger.It执行一次程序将帮助你完全理解流程。