我正在阅读一个包含以下函数的程序:
int f(int n) {
int c;
for (c=0;n!=0;++c)
n=n&(n-1);
return c;
}
我不太明白这个函数的目的是什么?
这个算法用于计算 n 的二进制表示中 1 的数量。
countBinaryOnes
而不是 f
,那么这个问题本来就不需要被问到,我喜欢这种方式。另外加一。 - Camn = n&(n-1)
很遗憾,INT_MIN-1是一种溢出情况,而且溢出会引起未定义的行为。符合规范的实现不要求对整数进行“环绕”,它可能会发出溢出陷阱,或者留下各种奇怪的结果。
这是一种(现在已经过时的)解决非军用CPU缺少POPCNT指令的方法。
这个方法通过使用二进制和运算来计算将n
减少到0
所需的迭代次数。
表达式n = n & (n - 1)
是一种按位运算,它将 n
中最右边的 '1' 换成了 '0'。
例如,取一个整数 5(0101)。那么 n & (n - 1)
→ (0101) & (0100)
→ 0100
(从右侧移除第一个 '1' 位)。
因此,上述代码返回给定整数的二进制形式中 '1' 的数量。
它是否试图返回n中有效位数的数量?(还没有完全思考...)
f
是这个函数的一个糟糕的名称。 - David Thornley