目录
一:概念定义
位运算包括:位与,位或,异或,左移,右移等等操作
我们知道,计算机中的数在内存中都是以二进制形式进行存储的 ,而位运算就是直接对整数在内存中的二进制位进行操作,因此其执行效率非常高,在代码中尽量使用位运算进行操作,这会大大提高程序的性能和运行效率。
二:基本操作
1.求数字n的二进制表示中第k位数字
分为两步
第一步:将第k个数字移动到最后一位:n>>k
第二步:读取最后一位数字:n>>k&1
因此答案是n>>k&1
2.求数字n的二进制表示中最后一位1
举例:n是12,二进制表示是1100,因此最后一位1就是100
我们用lowbit(x)来实现该问题,可以先看下图方便理解
int lowbit(int x){
return x&(-x);
}
三:题目描述
题目
给定一个长度为 n 的数列,请你求出数列中每个数的二进制表示中 1 的个数。
输入格式
第一行包含整数 n。
第二行包含 n 个整数,表示整个数列。
输出格式
共一行,包含 n 个整数,其中的第 i 个数表示数列中的第 i 个数的二进制表示中 1 的个数。
数据范围
1 ≤ n ≤ 100000,
0 ≤ 数列中元素的值 ≤ 10^9
输入样例
5
1 2 3 4 5
输出样例
1 1 2 1 2
四:思路解析
我们只需每次求出最后一个1,然后减去这个数字,能减多少次,就有多少个1
五:万年无误代码模板
#include<iostream>
using namespace std;
int lowbit(int x)
{
return x&(-x);
}
int main(){
int n;
scanf("%d",&n)
while(n--){
int x;
cin>>x;
int res=0;
while(x)
{
x-=lowbit(x);
res++;
}
cout<<res<<' ';
}
return 0;
}
创作不易,建议点赞+收藏+关注,以免变成付费资源或者找不到宝贝文章了。
基础集训结束后将开展拔高系列