Acwing 801.二进制中1的个数

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


算法1

(lowbit())

0.预备知识

1.原码:符号位加上真值的绝对值

2.反码:正数的反码是其本身,负数的反码是在其原码的基础上符号位不变,其余各个位取反。

3.补码:正数的补码就是其本身,负数的补码是在其反码的基础上+1

4.移码:不管正负数,只要将其补码的符号位取反即可

一个整数的负数就是补码+1

1.lowbit()

返回x的最后一位1

       x =   1010....10000
 
       ~x =  0101....01111
 
      ~x+1 = 0101....10000

  x&(~x+1) = 0000....10000

2.主要思路

1.每一次把最后一位1 去掉(减掉)

2.当 x == 0 时,说明没有1了

3.减的次数就是 x的二进制中1的个数

c++代码

#include <bits/stdc++.h>
using namespace std;

const int N = 1e6+10;

int n;
int a[N];

int lowbit(int x){  //返回x中最后一位1
    return  x & -x;  //一个整数的符数就是补码 +1
}
int main(){
    cin>>n;
    
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
   
    for(int i=1;i<=n;i++){
        int res=0;
        while(a[i]){
            a[i]-=lowbit(a[i]);
            res++;
        }
        cout<<res<<" ";
    }
    return 0;
}

n的二进制表示中第k位是几

n >> k & 1;

for(int k = 31; k >= 0; k--){

    cout<< (n >> k & 1);
}
请登录后发表评论

    没有回复内容