给定一个长度为 n 的数列,请你求出数列中每个数的二进制表示中 1 的个数。
输入格式
第一行包含整数 n。
第二行包含 n 个整数,表示整个数列。
输出格式
共一行,包含 n 个整数,其中的第 ii个数表示数列中的第 i个数的二进制表示中 1 的个数。
数据范围
1≤n≤100000
0≤数列中元素的值≤1e9
输入样例:
5
1 2 3 4 5
输出样例:
1 1 2 1 2
解题方法:首先要明确原码, 反码,补码之间的关系,原码即一个数的二进制数,反码即将原码每个数取反,补码即反码+1.本题可采用lowbit操作即x&-x = x&(~x + 1).
Code:
#include <iostream>
#include <stdio.h>
using namespace std;
const int N = 1e6 + 10;
typedef long long LL;
int n, ans, res, x;
int a[N], s[N];
int lowbit(int x)
{
return x & -x; /* x & - x 等价于 x & (~x + 1)即x的反码+1 */
}
signed main()
{
scanf("%d", &n);
while (n --)
{
cin >> x;
res = 0;
while(x)
{
x -= lowbit(x); 每次减去1所在位置的值
res ++;
}
cout << res << " ";
}
}