文章目录
题目描述
- 给定一个长度为
n
的数列,请你求出数列中每个数的二进制表示中1
的个数。
输入格式
- 第一行包含整数
n
。 - 第二行包含
n
个整数,表示整个数列。
输出格式
- 共一行,包含
n
个整数,其中的第i
个数表示数列中的第i
个数的二进制表示中1
的个数。
数据范围
1 ≤ n ≤ 100000
,0 ≤ 数列中元素的值 ≤ 10^9
基本思路
- 这道题是一道典型的位运算的题目。一种常用的位运算是
lowbit
运算,即找出一个二进制数中最低位的1
及其后面所有的0
。例如,对于整数10
,其二进制表示为1010
,对该数字使用lowbit
操作,得到的结果即1010
中最后的一个1
及其跟着的0
,即10
。 lowbit
操作的具体过程即将原始数字与该数字的补码进行按位与运算。- 每次将当前数字的
lowbit
结果从该数字中减去,相当于将原始数字中最后一位1
修改为0
。重复这个过程,到最后即可将原始数字中所有的1
都修改为0
,操作的次数即该二进制数中1
的个数。
实现代码
cpp
#include <cstdio>
const int N = 100010;
int arr[N];
int count_of_one(int n)
{
int result = 0;
while(n != 0)
{
n -= n & (-n);
result ++;
}
return result;
}
int main(void)
{
int n;
scanf("%d", &n);
for(int i = 0; i < n; ++i) scanf("%d", &arr[i]);
for(int i = 0; i < n; ++i) printf("%d ", count_of_one(arr[i]));
return 0;
}