题目描述
输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。
思路
- 循环操作:减去1后的数和原数相与,能将最低位的1置0
- 每次操作都会将最低位的1置0,所以能操作的次数=1的个数
- 举例:输入二进制数1100,和减去1之后的结果做与运算,1100&1011=1000,从原来整数最右边一个1那一位开始所有位都会变成0。那么一个整数的二进制有多少个1,就可以进行多少次这样的操作。
class Solution {
public:
int NumberOf1(int n) {
//每次操作都会将最低位的1置0,所以能操作的次数=1的个数
int cnt = 0;
while(n!=0){
//减去1后的数和原数相与,能将最低位的1置0
n = n & (n-1);
cnt++;
}
return cnt;
}
};