引子:今天打日常训练赛的时候有道题是求给定n个数的二进制一的个数,给的数据是int,原本想着打表快速过的,后来发现1e9还不如写自定义。
结果直接暴力过了····
晚上补题收集了几种求二进制一个数的技巧。
题目
Example
Input
2
5
1 2 3 4 5
4
2 4 8 16
Output
1 1 2 1 2
1 1 1 1
暴力写法
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define pre(i,a,b) for(int i=a;i>=b;--i)
#define m(x) memset(x,0,sizeof x)
#define PI acos(-1)
const int INF = 0x3f3f3f3f;
typedef long long ll;
const int maxn = 1e9+10;
vector<int>v;
int PreDeal(int k)
{
int ans = 0;
int t = k;
while(t)
{
int temp = t%2;
if(temp)ans++;
t/=2;
}
return ans;
}
int main()
{
//PreDeal();
int T,a;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
for(int i=0;i<n;++i)
{
scanf("%d",&a);
if(i!=n-1)printf("%d ",PreDeal(a));
else printf("%d\n",PreDeal(a));
}
}
return 0;
}
函数写法
C++ 中的 _builtin_popcount
可以直接得到一的个数
技巧写法
int fun(int x)
{
int ans = 0;
for(int i=x;i;i-=i&-i)ans++;
return ans;
}
i&(-i)运算的功能为返回 i 的二进制数表示为1的最低位的权值