难以理解部分代码(位操作)
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;
}
为什么
while
?例如,如果我有1011
,它不会停在 0 吗?为什么
nr += x%2
?为什么
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
的值(即给定整数中设置的位数)返回给调用函数。
了解程序流的最佳方法是通过调试器执行程序。我强烈建议您通过调试器执行一次程序。它将帮助您完全了解流程。
- 对字符串进行位操作
- 对字符数组中的元素执行逐位操作
- 逐位操作的隐式类型转换
- 如何进行特定的位操作?
- 16 位到 10 位转换代码说明
- C++避免位操作完全移位
- 使用双包装器类进行位操作(C++、clang)修复性能下降问题
- 使用位操作优化检查
- 子集相关位操作
- 使用 c++ 提升库的按位操作
- 位操作和异或
- CPP DLL 自定义操作代码在安装过程中未执行
- 位操作将最左侧的设置位转换为右侧交替位?
- 为什么对小于 4 个字节的整数类型的位操作会发生意外行为?
- 对 NULL 值的按位操作是否会使C++中的代码崩溃
- 用于检查 double 是否为 2 的幂而没有C++位操作的代码
- 难以理解部分代码(位操作)
- 位操作-解释下面的c++代码片段
- 位操作-解释下面的c++代码部分
- 位操作-C/C++代码,将字符数组视为位流