我正在阅读《C语言程序设计》这本书,在第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时,循环就会停止吗?
我只是无法理解这种方法的工作原理,而且我已经寻找了相当长时间的解决方案。
谢谢。
if (x & 01)
等同于if ((x & 01) != 0)
,尽管在实践中,(x & 01)
只能获得非零值 1。一般来说,if (expr)
等同于if ((expr) != 0)
,这就是我最初的改写。 - Jonathan Lefflerif
语句的上下文中使用位运算符,那么你正在提出一个有些不同、明显更大的问题。01
是一个八进制常量,等于001
、'\001'
、1
、0x1
、0x00000001
等,也就是“一”。两个值的按位“与”比较每个参数(在x
和1
中)中的每个位位置,并在相应的结果中产生一个位,如果两个输入位都是1,则为1,否则为0。在这种情况下,唯一可能产生非零值的位是LSB,即最低有效位。 - Jonathan Leffler