此程序应该确定变量 c_val
的值中存储了多少个单元,如果每个单元存储为一个设置位。
我的问题是:为什么作者要这样写 if (c % 2 == 1) count++;
then shift c
with this statement c = c >> 1;
?
#include <stdio.h>
#include <cstdlib>
int main(){
unsigned char c_val;
printf("char value = ");
scanf("%c", &c_val);
int count = 0;
unsigned char c = c_val;
while(c){
if (c % 2 == 1) count++;
c = c >> 1;
}
printf("%d bits are set", count);
system("pause");
}
最佳答案
char 类型的数据大小总是一个字节 - 没有异常(exception)。但是,这段代码计算了 popcount - 即 c_val
中 1 的位数。
我们可以翻译相关代码
while (c) {
if (c % 2 == 1) count++;
c = c >> 1;
}
到
while (c != 0) {
if (c & 0x1 == 1) count++; /* if the rightmost bit of c is 1, then count++ */
c = c / 2;
}
我所做的最后更改之所以有效,是因为右移无符号整型数据类型(在本例中为 unsigned char
)等同于除以 2,具有向零舍入语义。
我们可以将 c
视为比特传送带 - 在每次循环迭代中,零比特从左侧进入,而一个比特从右侧掉落。如果最右边的位是 1,我们将计数加 1,否则计数保持不变。因此,一旦 c
被零位填充,我们就知道我们已经计算了所有的一位,并且恰好是一位,所以 count
包含了中的一位数c_val
.
关于c++ - 确定字符中设置位的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9867198/