K&R中的位计数功能

wuy*_*bao 7 c bit-manipulation bit

在K&R的"C编程语言"一书中,有一个位计数功能:

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

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

add*_*aon 10

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

  • 正确。我们在80年代中期使用的编码标准规定,必须使用八进制或十六进制常量才能使位操作更明显,并且01比0x1更容易键入。我们倾向于对大于7的值使用十六进制。 (2认同)