位运算

一、算法描述

本篇文章介绍位运算,直接从用法方面来介绍。

求第 K 位

  • 将第 k 位移到最后面。
  • &1 即可。

所以操作为:n >> k & 1

求最后一个 1(求 1 的个数)

  • x      =   1010...100...0

  • ~x      =   0101...011...1

  • ~x+1    =   0101...100...0

  • x & (~x+1) =  0000...100...0

  • ~x 表示 x 的按位取反操作,例如 x0101 ,那么 ~x 就是 1010

  • 由于计算机中存储数据都是用补码,所以刚好 ~x + 1 就是 x

  • 所以求最后一个 1 的操作为:x & -x

二、题目描述

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

输入格式

第一行包含整数 n

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

输出格式

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

数据范围

1n100000,
0109

输入样例:

5
1 2 3 4 5 

输出样例:

1 1 2 1 2 

三、题目来源

AcWing算法基础课-801.二进制中1的个数

四、源代码

#include <iostream>

using namespace std;

const int N = 100010;

int n;

int lowbit(int x)
{
    return x & -x;
}

int main()
{
    cin >> n;
    
    while (n -- )
    {
        int x;
        cin >> x;
        
        int res = 0;
        while (x)   x -= lowbit(x), res ++ ;
        
        cout << res << ' ';
    }
    
    return 0;
}
posted @   grave-master  阅读(71)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示