c - 带 if 的位运算符

标签 c bit-manipulation

我正在阅读 C 语言的 K&R 书,在第 2.10 节中他们给出了以下示例:

/*bitcount: count 1 bits in x*/
int bitcount(unsigned x)
{
    int b; 
    for(b=0; x!=0;x>>=1)
       if(x&01)
           b++;
     return b;

}

该函数应该计算 x 中为 1 的位数。

我知道 if 应该“屏蔽”这些位,但我不明白怎么做?

这个条件基本上是:

if(x&01==1)?

我不明白这个条件。

(x&01) 是什么意思?

另外,我不明白循环什么时候停止?每当所有位都右移并且所有空出的单元格现在都为 0 时?

我只是不明白这个方法是如何工作的,我找了好久的解决方案。

谢谢。

最佳答案

让我们使用 while 循环重写该函数。

int bitcount(unsigned x)
{
    int b = 0;
    while (x != 0) {
        if (x & 0x1)
            b++;
        x = x >> 1;
    }

    return b;
}

请注意,循环的每次迭代,我们都会做两件事:

  1. 如果数字的最低位为高(数字为奇数),则我们将位计数器加一。
  2. 每次迭代,我们将数字除以 2 (x = x >> 1)

关于c - 带 if 的位运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20314643/

相关文章:

c - 测试迭代指针之间的关系是否安全?

c - 如何查看管道是否为空

c - 如何在 C 中的整数数组中选择(有效)随机相邻点?

Java double 和 int 值之间的按位 AND 运算

c - 如何使用c查找字符串中的文章数?

c - 一个小查询,C 中的字符串

c - 在标准 C 中使用 char 数组存储多种数据类型

c - 使用 XOR 按位运算执行逐字节比较

java - 最快的两个数字符号比较(包括零)

c - 如何比较C中的两个位值?