求二进制中1的个数(位运算知识点)

题目传送门:801. 二进制中1的个数

给定一个长度为 n 的数列,请你求出数列中每个数的二进制表示中 1 的个数。

输入格式

第一行包含整数 n。

第二行包含 n 个整数,表示整个数列。

输出格式

共一行,包含 n 个整数,其中的第 i 个数表示数列中的第 i 个数的二进制表示中 1 的个数。

数据范围

1≤n≤100000,
0≤数列中元素的值≤1e9

输入样例:
5
1 2 3 4 5
输出样例:
1 1 2 1 2
试题解析:

本题旨在求各十进制数的二进制表示中1的个数,首先我们来介绍一下一个位运算知识点。

若想返回n的最后一位1:

        lowbit(n) = n & -n;

若n=10,其二进制为1010,则结果为二进制的10,即为2,取的是最后一位1及之后的数字。

如何将该知识点运用与本题呢?

我们可以每次都统计一下n最后一位对应的数,先用n减去此数,再用计数器记录存在1的个数,直至n最终减为0,提取计数器便可知当前数字n的二进制表示中1的个数了。

代码如下:
#include
using namespace std;
int lowbit(int x)
{
	return x&-x;
}
int main()
{
	int n,x;
	cin>>n;
	for(int i=0;i>x;
		int res=0;
		while(x) x-=lowbit(x),res++;//每次减去x的最后一位1,并进行一次计数
		cout<

最后,补充一个知识点:

当我们想获取n二进制形式的第k位数字时:

        可以使 n >> k & 1;

先右移k位后和1想与,结果则是n的第k位数字。

你可能感兴趣的:(算法,数据结构)