这是《剑指Offer》的第十五题:

编写一个函数,输入是一个无符号整数,返回其二进制表达式中 数字位数为 1 的个数。

我们通过这道题来介绍一个常见的位运算的方法:**对一个整数 n,n = n & (n - 1) 可以将 n 的最右边的 1 变成 0。**例如,n = b1001,n - 1 = b1000,然后 n & (n - 1) = b1000。 你看,n 最右边的 1 被成功变成了 0,其他位则保持不变。然后,我们可以利用 这个结论来快速求解上述问题。这个问题是想知道一个整数中 n 的个数,那么 我们就可以用一个循环,结束条件为 n == 0,循环体让 n = n & (n - 1)。这样, 循环进行了几次,n 中就有几个 1。

这个结论在很多位运算的题目中都可以用上。比如,求两个整数的二进制表示 不同的位数。我们可以先对两个数进行异或操作得到数 n,然后利用这个结论,求出 n 中含有 1 的个数。

以上。