给定一个长度为 n 的数列,请你求出数列中每个数的二进制表示中 1 的个数。
输入格式第一行包含整数 n。
第二行包含 n 个整数,表示整个数列。
输出格式共一行,包含 n 个整数,其中的第 i 个数表示数列中的第 i 个数的二进制表示中 1 的个数。
数据范围1 ≤ n ≤ 100000 , 0 ≤ 数 列 中 元 素 的 值 ≤ 109 1≤n≤100000,\ 0≤数列中元素的值≤109 1≤n≤100000,0≤数列中元素的值≤109
输入样例:5 1 2 3 4 5输出样例:
1 1 2 1 2思想
我们需要提要一个运算:与运算。
与运算与运算将会对两个数进行二进制的逐位取与。如:1001 & 110 = 1000
原码与补码计算机中,数字是使用补码存储的,在导论中我们学过,正负数的转换只需要进行取反加一。
求最小位1如,有一个数10,其二进制补码为 01010 ,对其取反加一即求-10得到 10110 ,他们俩进行与运算,得到 10,我们发现,一个数对它的负数进行求与,就能求出最低位的1,这对解题提供了帮助,我们只需要每次求一次最小位1,并将它减去,就可以反复求该数的二进制中有多少个1了。
代码实现//
// Created by Owwkmidream on 2021/10/31.
//
#include "iostream"
using namespace std;
int lowbit(int n)
{
return n & -n;
}
int main() {
int n;
cin >> n;
int a[n];
for (int i = 0; i < n; ++i) {
cin >> a[i];
int r = 0;
while(a[i] > 0) {
a[i] -= lowbit(a[i]);
r++;
}
cout << r << " ";
}
return 0;
}



