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);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!