今天介绍几种常见的位运算方法:
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
a | 1 | 1 | 0 |
---|---|---|---|
a-1 | 1 | 0 | 1 |
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检错有点像)
好了这就是全部内容了,其实特别好记就是一个^和一个&。但是真的好用。
后续如果我碰到好用的还会添加的哦!谢谢看完!!