这个function有什么作用?

我正在读一个包含以下function的程序,即

int f(int n) { int c; for (c=0;n!=0;++c) n=n&(n-1); return c; } 

我不太明白这个function打算做什么?

它以n的二进制表示计数1的数

它旨在表明评论的重要性。

该函数是INTENDED以返回n表示中的位数。 在其他答案中遗漏的是,该函数调用参数n <0的未定义行为。这是因为该函数从最低位到最高位一次剥离一位数。 对于负数,这意味着,循环终止前的n的最后一个值(对于2补码中的32位整数)是0x8000000。 这个数字是INT_MIN,现在它最后一次在循环中使用:

 n = n&(n-1) 

不幸的是,INT_MIN-1是溢出并且溢出调用未定义的行为。 一个符合要求的实现不需要“包围”整数,例如它可以发出溢出陷阱或留下各种奇怪的结果。

对于非军用cpu中缺少POPCNT指令,这是一个(现在已经过时)的解决方法。

这计算通过使用二进制和将n减少到0所需的迭代次数。

它展示了一种如何不编程的方法(对于x86指令集),使用内部/内联汇编程序指令更快更好地读取这样简单的东西。 (但据我所知,这只适用于x86架构,我不知道它是关于ARM或SPARC或其他什么的)

表达式n = n & (n - 1)是按位运算,它将n = n & (n - 1)最右边的位’1’替换为’0’。

例如,取整数5(0101)。 然后n & (n - 1)(0101) & (0100)0100 (从右侧移除第一个’1’位)。

所以上面的代码返回给定整数的二进制forms的1的数量。

可能是它试图返回n中的有效位数? (没想完全……)