给定一个长度为 n
的数列,请你求出数列中每个数的二进制表示中 1
的个数。
输入格式
第一行包含整数 n
。
第二行包含 n
个整数,表示整个数列。
输出格式
共一行,包含 n
个整数,其中的第 i
个数表示数列中的第 i
个数的二进制表示中 1
的个数。
数据范围
1≤n≤100000
,
0≤数列中元素的值≤109
输入样例:
5
1 2 3 4 5
输出样例:
1 1 2 1 2
(1)求n的二进制数表示中第k位是几?
n >> k & 1
(2)lowbit操作:返回x的最后一位1(返回是一个二进制数)
x & -x
计算过程:
#include <iostream>
using namespace std;
int n;
int main ()
{
scanf("%d", &n);
while(n -- )
{
int x;
scanf("%d", &x);
int res = 0;
while(x)
{
if(x & 1) res ++; // 取x最后一位
x = x >> 1; // x 右移一位
// lowbit写法
// x -= (x & -x); // (x & -x) 就是lowbit操作,每次减去最后一个1,然后res++,减了多少次就有多少个1,比上面那种稍微快一点
//res ++;
}
printf("%d ", res);
}
return 0;
}