给定一个长度为 n 的序列,请你求出数列中每个数的二进制表示中 1 的个数。
输入格式
第一行包含整数 n。
第二行包含 n 个整数,表示整个数列。
输出格式
共一行,包含 n 个整数,其中的第 i 个数表示数列中的第 i 个数的二进制表示中 1 的个数。
数据范围
1≤n≤100000
0≤数列中元素的值≤109
输入样例
输出样例
题解
(lowbit)
(x&−x)⟺(x&(∼x+1))
例如二进制 1010101000 经过 ∼ 运算后为 0101010111,+1 后为0101011000,故 x&(∼x+1)) 将最后一个 1 之前的所有数都与为 0,即 [10011001100111000000] 或运算后得到 0000001000。
基础拓展:
以 x=000⋯01010 为例:
源码(x):000⋯01010
反码(∼x):111⋯10101
补码(∼x+1):111⋯10110
计算机中使用补码来存储负数。
C++ 代码
CPP
#include <iostream>
using namespace std;
int lowbit(int x)
{
return x & -x;
}
int main()
{
int n;
cin >> n;
while(n--)
{
int x, res = 0;
cin >> x;
while(x)
x -= lowbit(x), res++;
cout << res << " ";
}
return 0;
}
评论区