一. 题目

二. 理论

  • 思路:位运算算法利用二进制位的操作来处理数据,通常涉及操作符如与(&)、或(|)、非(~)、异或(^)、左移(<<)和右移(>>)。这些操作在计算机底层实现上非常高效,常用于各种算法优化中。

  • 时间复杂度:O(1)


  • 本题思路:数列中元素的值最大为1e9, 2^30为1073741824,所以右移至0~30位即可,每次右移都&1判断当前位是否为1,若为1则当前值二进制表示1的个数加1。

  • 或者利用x&-x求x的最后一位1。

三. 代码

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N=1e5+10;

int n;
int a[N];

//位运算类
class BitwiseOperations
{
public:
    static void initIO()
    {
        // 关闭输入输出缓存,使效率提升
        ios::sync_with_stdio(false);
        // 解除cin和cout的默认绑定,来降低IO的负担使效率提升
        cin.tie(nullptr);
        cout.tie(nullptr);
    }

    /**
     * [1] 返回x的二进制的最后一位1
     * [2] 判断一个数是否为 2 的幂:如果一个数是 2 的幂,
     * 那么它的二进制表示中只有一位是 1。这时 x & -x 等于 x 本身。
     * @param x
     * @return 如上
     */
    int lowbit(int x)
    {
        return x&-x;
    }

    int work(int x)
    {
        int cnt=0;
//        for(int i=0;i<31;++i)
//            if(x>>i&1)
//                ++cnt;
        while(x)
        {
            ++cnt;
            x-= lowbit(x);
        }
        return cnt;
    }
};

int main()
{
    BitwiseOperations::initIO();

    cin>>n;
    BitwiseOperations bitwiseOperations;
    for(int i=0;i<n;++i)
    {
        int x;
        cin>>x;
        int ans=bitwiseOperations.work(x);
        cout<<ans<<" ";
    }
}