可以每次右移一位遍历统计,也可以用n & (n - 1) 快速将最低位的1消去,统计消去所有1所需的次数,即为1的个数。
原理:设n的最低位1为第i位,那么n肯定是这样的形式...10...0(i - 1个0),那么n - 1的形式为...01...1(i - 1个1),可以看出n与n - 1最低i位都互不相同,那么n & (n - 1) 的最低i位全部为0,这样就相当于消去了n的最低位1。
class Solution {
public:
int NumberOf1(int n) {
int res = 0;
while (n) {
res++;
n &= (n - 1);
}
return res;
}
};

京公网安备 11010502036488号