文章目录
- 题目
- 数据范围
- 输入输出
- 算法
- 代码
- 总结
前言
二进制中1的个数
提示:以下是本篇文章正文内容,下面案例可供参考
一、题目
给定一个长度为 nn 的数列,请你求出数列中每个数的二进制表示中 11 的个数。
输入格式
第一行包含整数 nn。
第二行包含 nn 个整数,表示整个数列。
输出格式
共一行,包含 nn 个整数,其中的第 ii 个数表示数列中的第 ii 个数的二进制表示中 11 的个数。二、数据范围
1≤n≤1000001≤n≤100000,
0≤数列中元素的值≤1090≤数列中元素的值≤109
三、读入数据
输入样例:
5
1 2 3 4 5
输出样例:
1 1 2 1 2
四(1)算法一,代码一
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int mas=100005;
int n;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int res=0,temp=0;
scanf("%d",&temp);
for(int i=31;i>=0;i--) if(temp>>i&1)res++;
std::cout<<res<<" ";
}
return 0;
}
(1)算法一 代码一 总结:
1.auto tmep:v 是从0将里开的所有数组都要输入检测
2.&与运算符
&&和||或
^异或
3.for(int i=31;i>=0;i--) if(temp>>i&1)res++;
为什么是从31开始,最后到0呢
因为int整形,4个字节,共有32个比特位
最后到0,是因为相当于没有移动,最后一个,就是最后一个比特位
开始时31,是因为相当于移动了31位,此时最后一个,就是第一个比特位
4.还有就是右移左移,他的大小不会变,只会返回结果,并不会存入temp中去
5.if(temp>>i&1)res++;
为什么要temp>>i以后会&1,如果不进行&会怎么样
temp>>i右移以后返回值,是多位数的二进制,我们每次都只能够统计每一位,即统计右移的最后一位
一共有32位最多,就从0开始到31。如果与1(计算机中二进制000000000000001)相与,得到的就是最后一位,不与得到的就是多位的二进制
(2)算法二 代码二
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n;
int lowbit(int x)
{
return x&-x;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int temp,res=0;
scanf("%d",&temp);
while(temp)temp-=lowbit(temp),res++;
cout<<res<<" ";
}
return 0;
}