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

时间:2015-06-20 15:05:20

标签: c++ bit bitwise-operators

我无法理解如何计算二进制表示中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

2 个答案:

答案 0 :(得分:2)

<强>首先

nr += x % 2;

想象一下二进制x:

...1001101

Modulo运算符从a / b返回余数。

现在x的最后一位是0,在这种情况下,2将始终进入带有0余数的x或1,在这种情况下它返回1。

正如你所看到的,x%2将返回(如果最后一位是一个)一个,因此nr增加1或不增加,在这种情况下nr不变。

x /= 2;

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

....10

它将找出2次进入它的次数,在这种情况下1.它有效地丢弃二进制数的最后一位数,因为在基数2(二进制)中,2进入数字的次数只是就像把空间“移动”一样(这是一个很糟糕的解释,请问你是否需要详细说明)。这有效地“迭代”了二进制数,允许该行检查下一位。

这将迭代直到二进制只是1然后一半,删除余数,x将等于0,

while (x != 0)

在这种情况下退出循环,你已检查过每一位。

同时

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

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

答案 1 :(得分:1)

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不是eqaul为0所以它第三次进入while循环。

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

由于检查(while x != 0)失败,流程就会退出循环。

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

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