题意:
给定一个长度为$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);
}
标签:反码,二进制,....,补码,int,10000,801,Acwing
From: https://www.cnblogs.com/ltphy-/p/18437928