801. 二进制中1的个数
位运算操作
#include<iostream>
using namespace std;
const int N = 100010;
int a[N];
int main(){
int n;
scanf("%d",&n);
for(int i = 0 ; i < n ; i ++){
scanf("%d",&a[i]);
int sum = 0;
//循环二进制最大表示数 &1 表示补一 偶数变1
for(int k = 31 ; k >= 0 ; k --){
if((a[i] >> k & 1) == 1) sum++;
}
printf("%d ",sum);
}
return 0;
}
lowbit算法
#include<iostream>
using namespace std;
//lowbit求出二进制最后一个位数为1开始的数 如1010 得10
int lowbit(int x){
return x & -x; //(-x) = (~x+1) x取反+1
}
int main(){
int n;
scanf("%d",&n);
while(n--){
int x;
scanf("%d",&x);
int res = 0 ;
//x不为0 则一直减去最后一位为1的数 最后循环的次数为1出现的次数
while(x) x-=lowbit(x),res++;
printf("%d ",res);
}
return 0;
}
评论区