【算法基础篇】位运算

AcWing 801. 二进制中1的个数

https://www.acwing.com/problem/content/803/

AC代码一

对于每个数字a,a&1得到了该数字的最后一位,之后将a右移一位,直到位0,就得到了1的个数

#include <iostream>
using namespace std;

int main()
&#123;
    int n;
    cin >> n;
    while (n -- )
    &#123;
        int x, res = 0;
        cin >> x;
        while(x)
        &#123;
            res += x & 1;
            x >>= 1;
        &#125;
        cout << res << " ";
    &#125;
&#125;

AC代码二

使用lowbit操作,进行,每次lowbit操作截取一个数字最后一个1后面的所有位,每次减去lowbit得到的数字,直到数字减到0,就得到了最终1的个数,

#include <iostream>
using namespace std;

int lowbit(int x)  // 返回末尾的1
&#123;
    return x & -x;
&#125;


int main()
&#123;
    int n;
    cin >> n;
    while (n -- )
    &#123;
        int x, res = 0;
        cin >> x;
        while(x)
        &#123;
            res ++;
            // 减多少次 说明 x里有多少个1
            x -=  lowbit(x);
        &#125;
        cout << res << " ";
    &#125;
&#125;

 上一篇
【算法基础篇】离散化 【算法基础篇】离散化
离散化思路 转载一位大佬完美解释https://www.acwing.com/solution/content/2321/ 此题第一次看确实没看懂,所以此处略作分析,为什么要离散化呢,因为存储的下标实在太大了,如果直接开这么大的数组,根本
下一篇 
【基础算法篇】前缀和与差分 【基础算法篇】前缀和与差分
前缀和什么是前缀和 原数组: a[1], a[2], a[3], a[4], a[5], …, a[n] 前缀和 Si为数组的前 i项和,即前缀和为: S[i] = a[1] + a[2] + a[3] + … + a[i] 前缀和的作用
  目录