给定一个长度为n的数列,请你求出数列中每个数的二进制表示中1的个数。
输入格式
第一行包含整数n。
第二行包含n个整数,表示整个数列。
输出格式
共一行,包含n个整数,其中的第 i 个数表示数列中的第 i 个数的二进制表示中1的个数。
数据范围
1≤n≤100000,
0≤数列中元素的值≤109
输入样例:
5
1 2 3 4 5
输出样例:
1 1 2 1 2
#include <stdio.h>
#define lowbit(x) ((x)&(-x))
int main(){
int n,cnt,t;
scanf("%d",&n);
// //位与 移位(可以用对2取余和除以2代替 但位操作速度更快一些)
// while(n>0){
// n--;
// scanf("%d",&t);
// cnt=0;
// while(t!=0){
// if(t&1==1) cnt++;
// t=t>>1;
// }
// printf("%d",cnt);
// if(n!=0) printf(" ");
// }
//使用lowbit函数 lowbit(x) == x & (-x) 截取最低位的第一个1及后面的0
//c语言好像没有lotbit函数 新人 如果有大佬知道的话 求告知
while(n>0){
n--;
scanf("%d",&t);
cnt=0;
while(t!=0){
t-=lowbit(t);
cnt++;
}
printf("%d",cnt);
if(n!=0) printf(" ");
}
return 0;
}