这个功能有什么作用?

use*_*850 20 c c++

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

int f(int n) {
    int c;
    for (c=0;n!=0;++c) 
        n=n&(n-1);
    return c;
}
Run Code Online (Sandbox Code Playgroud)

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

Vla*_*mir 36

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

  • 我喜欢不需要问这个函数是否被称为`countBinaryOnes`而不是`f`.另外,+1. (8认同)
  • 编码优雅:A+。编码清晰度:F. (2认同)

pro*_*rmr 12

它旨在显示评论的重要性.

  • 不,显然不是.它旨在表明良好的功能名称是多么重要. (16认同)
  • @JeremyP:不. (3认同)
  • 描述性函数名称可能被视为注释. (2认同)

Nor*_*ame 6

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

n = n&(n-1)
Run Code Online (Sandbox Code Playgroud)

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


mvd*_*vds 5

这是针对非军用 CPU 中缺少 POPCNT 指令的一种(现已过时)解决方法。