注意 n 的右移会将最高位复制到右边,如果 n 为负数,那么就会出现死循环。死循环解法如下:
1 | class Solution { |
要避免死循环非常简单,可以将 n 转换为 unsigned int,解法如下:
1 | class Solution { |
书中还有一个很神奇的解法:
1 | class Solution { |
这个解法的关键有几点:
- 如果一个数字非 0,那么它的二进制位中至少包含一个 1
- 一个数字 -1 的操作就是将它离最低位最近的 1 变成了 0,而将该位后面的 0 变成了 1
- 将该数字与 -1 后的数字取且,就会得到一个新的数字,这个数字中将原来的最低为 1 的位右侧的所有位变成了 0
举一个例子就是:如果一个数字 n=12,那么它的二进制表示为 1100,那么 n-1 的二进制表示为 1011,n&(n-1)的二进制表示为 1000。这完全符合上述规律。