我正在读一个包含以下功能的程序,即
int f(int n) {
int c;
for (c=0;n!=0;++c)
n=n&(n-1);
return c;
}
Run Code Online (Sandbox Code Playgroud)
我不太明白这个功能打算做什么?
函数是INTENDED以返回n表示中的位数.在其他答案中遗漏的是,该函数调用参数n <0的未定义行为.这是因为该函数从最低位到最高位一次剥离一位数.对于负数,这意味着,循环终止前的n的最后一个值(对于2补码中的32位整数)是0x8000000.这个数字是INT_MIN,现在它最后一次在循环中使用:
n = n&(n-1)
Run Code Online (Sandbox Code Playgroud)
不幸的是,INT_MIN-1是溢出并且溢出调用未定义的行为.一个符合要求的实现不需要"环绕"整数,例如它可以发出溢出陷阱或留下各种奇怪的结果.