[51node : 3216] [位运算] 授勋
3216 授勋
题目解析
因为任意一个正整数都可以用 \(2\) 的幂次方表示,所以这道题有解。
所以把这个数转化为二进制时,每一位的 "\(1\)" 对应的的就是一个二的 \(n\) 次幂。
例: \(6\)(10) -> \(110\)(2)
\(6 = 2^1 + 2^2\)
\(110\) 对应的是 \(2\) 的 \(1\) 和 \(2\) 次幂。
所以对于一个二进制数,其第 \(i\) 位(从右往左数)所对应的是底数为 \(2\), 指数为 \(i~-~1\) 的幂。
然后考虑做法。
把所输入的数的 "1" 都用位运算删除,并且统计起来即可。
Code
#include <bits/stdc++.h>
using namespace std;
int n, ans;
int main ()
{
scanf ("%d", &n);
for (int i = 1; i <= n; ++ i)
{
int t; ans = 0;
scanf ("%d", &t);
while (t)
{
ans += t & 1;
t >>= 1;
}
printf ("%d\n", ans);
}
return 0;
}