K& R中的位计数功能

时间:2014-01-10 18:25:44

标签: c bit-manipulation bit

在K& R的“C Programming Language”一书中,有一个位计数功能:

int bitsCount(unsigned x)
{
    int b;
    for (b = 0; x != 0; x >>= 1)
        if (x & 01)
            b++;
    return b;
}

我的问题是为什么他们使用 x& 01 但不是 x& 1 x& 00000001 ?是不是01表示八进制1?

1 个答案:

答案 0 :(得分:10)

在语义上,你是对的,没关系。 x & 01x & 1x & 0x1等都将完全相同(并且在每个合理的编译器中,生成完全相同的代码)。你在这里看到的是作者的惯例,曾经很标准(但从来没有普及),现在更不用说了。在这种情况下使用八进制是为了清楚地表明正在进行按位操作;我敢打赌,作者也在八进制中定义了标志常量(意图是按位或一起)。这是因为它更容易推理,比如010& 017,然后推理大约8& 15,你可以一次考虑一个数字。今天,我发现使用十六进制更常见,原因完全相同(按位操作一次应用一个数字)。十六进制超过八进制的优点是十六进制数字很好地与字节对齐,我希望在现代代码中看到用十六进制常量写的大多数按位运算(尽管琐碎的常数< 10我倾向于写为单个十进制数字;所以在这种情况下,我个人使用x & 1而不是x & 0x1