C++ 位运算常用操作 二进制中1的个数

给定一个长度为 n
的数列,请你求出数列中每个数的二进制表示中 1
的个数。

输入格式
第一行包含整数 n

第二行包含 n
个整数,表示整个数列。

输出格式
共一行,包含 n
个整数,其中的第 i
个数表示数列中的第 i
个数的二进制表示中 1
的个数。

数据范围
1≤n≤100000
,
0≤数列中元素的值≤109
输入样例:
5
1 2 3 4 5
输出样例:
1 1 2 1 2

(1)求n的二进制数表示中第k位是几?
n >> k & 1

C++ 位运算常用操作 二进制中1的个数_第1张图片
(2)lowbit操作:返回x的最后一位1(返回是一个二进制数)
x & -x

C++ 位运算常用操作 二进制中1的个数_第2张图片
计算过程:
C++ 位运算常用操作 二进制中1的个数_第3张图片

#include 

using namespace std;

int n;

int main ()
{
    scanf("%d", &n);
    while(n -- )
    {
        int x;
        scanf("%d", &x);
        int res = 0;
        while(x) 
        {
            if(x & 1) res ++; // 取x最后一位
            x = x >> 1; // x 右移一位
            // lowbit写法
            // x -= (x & -x); // (x & -x) 就是lowbit操作,每次减去最后一个1,然后res++,减了多少次就有多少个1,比上面那种稍微快一点
            //res ++;
        }
        printf("%d ", res);
    }
    return 0;
}

你可能感兴趣的:(算法笔记,基础算法,力扣,c++,算法)