题目描述
统计一个数用二进制来表示时1的个数
背模板时要理清的思路
假设x的二进制表示为110,一些关于二进制操作的代码结果
x >> 1 & 1 = 0
lowbit(x) = 10
x & -x = 10(就是lowbit(x))
本题不能用x >> k & 1来求各个位数上的1,原因是一个数的二进制表示的总位数(k)我是不知道的
具体步骤:
②第一步用lowbit得到低位上的1和后面的0,x -= lowbit(x)意思是将低位的1减掉,使下次枚举较高位上的1。
②第二步记录进行-=lowbit操作的次数,最终结果也就是存在1的位数
代码写法上的特点
①lowbit函数需要定义,函数体就是返回x & -x
参考文献
参考y总的代码
C++ 代码
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int n;
int a[N];
int lowbit(int x)
{
return x & -x;
}
int main()
{
cin >> n;
while (n -- )
{
int x;
cin >> x;
int res = 0;
while (x) x -= lowbit(x), res ++;
cout << res << ' ';
}
return 0;
}