我无法理解如何计算二进制表示中1的数量。
我有我的代码,我希望有人能为我解释。
代码:
int count (int x)
{
int nr=0;
while(x != 0)
{
nr+=x%2;
x/=2;
}
return nr;
}
为什么while
?例如,如果我有1011
,它就不会停在0?
为什么nr += x%2
?
为什么x/=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
的值(这是给定整数中设置的位数)返回给调用函数。
了解程序流程的最佳方法是通过调试器执行程序。我强烈建议您通过调试器执行一次程序。它将帮助您完全理解流程。