c++ - 确定字符中设置位的数量

标签 c++ c

此程序应该确定变量 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/

相关文章:

c++ - OpenSSL库中的SMIME_read_PKCS7方法有输入长度1200的限制?

c++ - 非数字输入检查

C - 如何在数组中存储带有变量的字符串?

c - 我正在尝试制作一个非常简单的刽子手程序。 while 循环不工作

c - xv6 中的 cgaputc(int c)/uartputc(int c)/constputc(int c) 有什么区别?

c++ - 为什么我不能放置/插入到我的 map 中?

c++ - 如何将 vector<...> 转换为 cv::Mat?

c++ - NSSet 与 unordered_set

c - 如何通过c中的引用将结构传递给函数

c - 如何区分与 getch() 具有相似响应的两个击键