问题:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
输入:整数n
输出:二进制表示中1的个数
思路:
本题有个巧妙之处,n&(n-1)可使最右边的1置0.
每循环一次,将最右边的1置为0.循环的次数等于二进制表示中的1的个数。
代码:
class Solution {
public:
int NumberOf1(int n) {
int count=0;
while(n)
{
++count;
n=n&(n-1); // set the most right 1 to 0
}
return count;
}
};
复杂度分析:循环次数等于二进制表示中1的个数,空间复杂度为O(1).