位运算最常用的两种操作
n的二进制表示中第k位是几:
先理解在二进制中的第几位的含义:在二进制中是从个位数开始依次向前标为0,1,2,3等
如下图所示:
红色的部分表示的是第几位。
明白了这个步骤后,接下来进行理解具体的操作步骤:
1.将第k位数字移到个位数上,涉及到了右移运算:n >> k
注解:1010
右移一位:101
, 右移两位:10
, 三位:1
2.输出个位上的数字,此时个位上的数字就是我们要求的第k位的数字,x & 1
代表的就是取出x中二进制中的个位数字
综上所述,所给操作只需要:n >> k & 1
就能完成
例:取出10前三位的数字
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n = 10;
for(int i = 3; i >= 0; i -- )cout << (n >> i & 1);
return 0;
}
Lowbit(x)运算
作用:返回x的二进制码中的最后一个1.(最右边的一个1)
例如:
x = 10;//二进制位1010
lowbit(x) = 10
x = 101000;//某数转化为二进制后的形式
lowbit(x) = 1000;
lowbit(x)的实现原理:
实现原理为:x & -x
注解:在c ++中,-x为x的补码形式,又等价于x的取反加1(~x + 1
)(均为二进制表示)
例如:x = 1001010010000100000000
则~x = 0110101101111011111111
,则~x + 1 = 0110101101111100000000
x & -x = 0000000000000100000000
实际用法:可以进行统计x里面1的个数(二进制码)
例题:
给定一个长度为 n 的数列,请你求出数列中每个数的二进制表示中 1的个数。
输入格式
第一行包含整数 n,第二行包含 n个整数,表示整个数列。
输出格式
共一行,包含 n个整数,其中的第 i 个数表示数列中的第 i 个数的二进制表示中 1的个数。
数据范围
1≤n≤100000,
0≤数列中元素的值≤109
输入样例:
5
1 2 3 4 5
输出样例:
1 1 2 1 2
#include<bits/stdc++.h>
using namespace std;
int lowbit(int x)
{
return x & -x;
}
int main()
{
int n;
cin >> n;
while(n -- )
{
int a;
cin >> a;
int res = 0;
while(a) a -= lowbit(a), res ++ ;//每一次当a不为0的时候,就把最后一位的1减去,用res进行计数,最后res的值记为删去的1的个数,也是原数中1的个数
cout << res << ' ';
}
}