题目
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
分析
一个数n如果减1,那么将这个2进制数从右向左的第一个“1”变成0,若这个1不是最低位,那么之后的所有位取反,而这个1左边的所有位保持不变。那么n与n-1相与可以使从右向左的第一个1与其之后的位变成0,那么这个2进制数有几个1,只需几次上述操作即可。
github链接如下:JZ11-二进制中1的个数
C++代码
#include <iostream>
using namespace std;
class Solution {
public:
int NumberOf1(int n) {
int cnt = 0;
while(n){
cnt++;
n = n & (n-1);
}
return cnt;
}
};
int main(){
int n;
cin>>n;
Solution s;
cout<<s.NumberOf1(n);
return 0;
}