快来看看,位运算装X大法,简单又好记。


今天介绍几种常见的位运算方法:

1.大小写字母转换

使用字符和空格字符异或就可以得到大小写的转换。

#include <iostream>
using namespace std;
int main(){
	char a = 'a';
	char b = a ^ ' ';
	a = b ^ ' ';
	cout << b << " " << a;
}

2.两个数的交换

使用下列语句可以完成两个数的交换,而不需要额外的变量。(用python不要说话😕)

#include <iostream>
using namespace std;
int main(){
	int a = 2;
	int b = 4;
	a = a ^ b;
	b = a ^ b;
	a = a ^ b;
	cout << a << " " << b; 
}

上面两个其实在算法里用的不太多,不过可以装一装嘿嘿!其实这种类似的有很多,这两个比较好记,所以就推荐给大家了。


好了咳咳!本文的重点来了,这一种位运算会在有的算法中用到。

3.使用n&(n-1)

n&(n-1) 可以消掉n的二进制数中的最后一位1。至于为什么我们来看:
假设a = 6那么用二进制表示就是110

a110
a-1101

a-1的结果就是101,那么异或的结果就是100,消除了a的最后一位。

应用:
1.计算汉明重量(也就是一个无符号整数中1的数量)
  • 解决:可通过不断的对n进行和n-1与操作直到n==0。每次测试记录++
  • 代码:
#include <iostream>
using namespace std;
int hmweight(unsigned int a);
int main(){
	unsigned int a;
	cin >> a;
	cout << hmweight(a); 
}

int hmweight(unsigned int a){
	int res;
	while(a!=0){
		//消除a末尾的1
		a &=a-1;
		//数量+1
		res++;
	}
	return res;
}
2.判断一个数是否是2的指数
  • 解决: 正常判断肯定就是通过不断累除来判断是否有余数(我是这么想的🤭),但如果用位运算就非常方便了。因为一个数如果是2的指数那么它的二进制中一定只有一个1。(笔者就不考虑负数的情况了)
  • 代码:
#include <iostream>
using namespace std;
int main(){
	unsigned int a;
	cin >> a;
	if(a&(a-1)) cout << "false";
	else cout << "true";
}

4.异或操作之关灯

通过异或操作我们可以让二进制上的位随我们的心意改变
例如1100
如果我们想把后两位变为1前两位变为0,就是和1111异或。1就是把原来的反转,0就是维持不变。(有点用吧,可能不是特别有用hah)
异或可以记成加法,但是这个加法不进位。(和我们计算机网络中的crc检错有点像)

好了这就是全部内容了,其实特别好记就是一个^和一个&。但是真的好用。

后续如果我碰到好用的还会添加的哦!谢谢看完!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值