【发布时间】:2013-03-12 19:21:54
【问题描述】:
我需要解释一下这条特定线路的工作原理。
我知道这个函数计算 1 的位数,但是这条线究竟是如何清除最右边的 1 位的呢?
int f(int n) {
int c;
for (c = 0; n != 0; ++c)
n = n & (n - 1);
return c;
}
有人可以简单地向我解释一下或给出一些“证据”吗?
【问题讨论】:
-
想想长减法和“借用”。
-
它会清除最右边的位,因为
n - 1的最右边位永远不会与n相同。 -
位旋转技巧通常应该使用无符号类型来完成,以防您的机器不使用二进制补码作为有符号类型(或者如果编译器尝试根据标准的知识进行一些巧妙的优化)符号类型不需要二进制补码)。
-
这个问题询问
n = n & (n - 1),换句话说n &= (n-1)。建议的“已回答”问题要求其他内容,如其标题中所述:n & (n-1)做了什么。前者的目的是去除最右边的 value-1 位,而后者是检查 n 是否是 2 的幂。我可以看到这两个表达式看起来相似并且它们的真值表相同,但是这两个问题,因此答案,无疑是不同的