原题链接:
题解:
lowbit函数(x&-x)可以返回一个数的最后一个1,因此我们可以利用这个函数搭配循环计算一个数中1的个数。
对于每个输入的整数 x,
lowbit(x)
的操作需要 O(log(m)) 的时间复杂度,其中 m 是 x 的最大值。lowbit(x)
的操作是通过按位与和取反运算实现的,取反运算需要考虑 x 的二进制表示中有多少位,最多 log(m) 位。因此,lowbit(x)
的时间复杂度是 O(log(m))。外层循环是对每个输入整数执行
lowbit
操作,因此时间复杂度是 O(n * log(m))。如果采用暴力的话,得把每个数字都转化为二进制,然后遍历统计1的个数,复杂度则为O(n^2)
另外,如果想要计算n的二进制数的第k位,也可以用位运算:n>>k&1
代码:
#include<bits/stdc++.h>
using namespace std;
int lowbit(int x) {
//返回x的最后一位1,例如x是10100的话,返回(100)b
return x & -x;
}
int main() {
int n;cin >> n;
while (n--) {
int x;cin >> x;
int res = 0;
while (x) {
x -= lowbit(x);
res++;
}
cout << res << " ";
}
}