位运算及其实现方式

位运算最常用的两种操作

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 << ' ';
	}
}

猜你喜欢

转载自blog.csdn.net/qq_51960163/article/details/115140579