K&R中的位计数function

在K&R的“C编程语言”一书中,有一个位计数function:

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

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

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