难以理解部分代码(位操作)

Having trouble understanding a portion of code (bit operation)

本文关键字:位操作 代码 解部      更新时间:2023-10-16

我不明白如何在二进制表示中计算 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

取模运算符返回 a/b 的余数。

现在 x 的最后一位要么是 0,在这种情况下

2 将始终进入 x,剩余数为 0,要么是 1,在这种情况下它返回 1。

如您所见,x % 2 将返回(如果最后一位是 1)一个,从而将 nr 增加 1,或不增加,在这种情况下 nr 保持不变。

x /= 2;

这会将 x 除以 2,因为它是整数,所以会删除余数。这意味着二进制是

....10

它将找出 2 会进入多少次,在本例中为 1。它有效地删除了二进制数的最后一位数字,因为在以 2(二进制)为基数中,2 进入数字的次数与将所有内容"移"到一个空格中相同(这是一个糟糕的解释,请询问您是否需要详细说明)。这有效地"迭代"了二进制数,允许即将检查下一个位的行。

这将迭代直到二进制文件刚好1然后是一半,去掉余数,x 将等于 0,

while (x != 0)

在这种情况下,退出循环,您已经检查了每个位。

也:

'

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

NR 将始终是大于或等于零的整数,因此您可能应该将返回类型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是否等于零。 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 的 eqaul,因此它第三次进入 while 循环。

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

由于它没有通过检查(while x != 0),流就退出了循环。

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

了解程序流的最佳方法是通过调试器执行程序。我强烈建议您通过调试器执行一次程序。它将帮助您完全了解流程。