给定一个长度为 n 的数列,请你求出数列中每个数的二进制表示中 1 的个数。
输入格式
第一行包含整数 n。
第二行包含 n 个整数,表示整个数列。
输出格式
共一行,包含 n 个整数,其中的第 i 个数表示数列中的第 i 个数的二进制表示中 1 的个数。
数据范围
1≤n≤100000,
0≤数列中元素的值≤
输入样例:
5
1 2 3 4 5
输出样例:
1 1 2 1 2
可以用lowbit的应用:lowbit(x)返回的是x的最后一位1;
即是利用x - (x & (~x + 1)),没次相减就会减去一个1,直到x减到0为止,减去的次数就是x二进制中1的个数。
x&(~x+1)结果就为000000......10000
即当x -(x&(~x+1))为0时减去的次数就为二进制中1的个数。
下面是解题的代码:
#include <bits/stdc++.h>
using namespace std;
int n;
int main ()
{
cin >> n;
for(int i = 0; i< n ;i++)
{
int x,s= 0;
cin >> x;
while(x) x -= (x & (~x+1)),s++;
cout << s <<' ';
}
return 0;
}