1 二进制中1的个数
题目链接
https://www.acwing.com/problem/content/803/
题目大意
给定一个长度为n的数列,请你求出数列中每个数的二进制表示中1的个数。
解题思路一 暴力
对于每一个数字a,a & 1得到了该数字的最后一位是1或者0,统计为1的次数,之后将a右移一位,直到为0
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin >> n;
for(int i = 0;i < n;i++){
int x;
cin >> x;
int k = 0;
while(x != 0){
k += x & 1;
x = x >> 1;
}
cout << k << " ";
}
return 0;
}
解题思路二
使用 lowbit操作,每次 lowbit 操作截取一个数字最后一个1后面的所有位,每次减去 lowbit 得到的数字,直到数字减到0,就得到了最终1的个数
具体原理可以参考如下
https://www.acwing.com/solution/content/2370/
#include<bits/stdc++.h>
using namespace std;
int lowbit(int x){
return x & (-x);
}
int main(){
int n;
cin >> n;
for(int i = 0;i < n;i++){
int x;
int res = 0;
cin >> x;
while(x){
x -= lowbit(x);
res++;
}
cout << res << " ";
}
return 0;
}