[算法学习笔记] 位运算
闲话:当时做ybt 1250的时候不会位运算被嘲讽了...特写篇文章纪念一下:
位运算
位运算就是在数据二进制形式下进行操作,众所周知电脑最终处理的是二进制,所以使用位运算来代替一些普通十进制下的运算可以大大提高效率。(可以理解为位运算是在数据底层操作)
这里将介绍几种实用的位运算,以及基本应用,仅供参考。
& and
& 是and的意思,如果两位都是1,则结果为1,否则为0.
举个例子:
1011 & 0011 = 0011
显然可以在十进制下操作,也就是1011&0011 = 13&3
&运算可以进行判断某一位是否为1的操作,我们知道1的二进制位0001,奇数的二进制最后一位为1,偶数为0,若定义自然数\(x\),如果x&1==1
则为奇数,反之亦然。
显然&运算可以与其他运算符相结合,比如ybt 1250和>>相结合,这里暂且不提。
| or
|运算通常用于二进制特定位上的无条件赋值,例如一个数|1的结果就是把二进制最末位强行变为1。
如果需要把二进制最末位变成0,对这个数|1之后再减1就可以了,其实际意义就是把这个数强行变成最近接的偶数。
由于笔者至今没怎么见过|的小技巧 我太菜了ww,先不提用法了,以后遇到再更
^ xor
个人感觉这个最反人类了
和 & 类似,都是将两个数的二进制进行运算,运算规则如下:
0^1 = 1
1^0 = 1
0^0 = 0
1^1 = 0
发现了吗?两位不同为1,相同为0,再举个例子:
0010 ^ 1101 = 1111
至于应用就是逆运算了吧,定义a^b=c,那么 c^b = a,也就是(a ^ b)^b=a (显然一个数连续两次xor等于其本身)
可以进行一些简单的加密解密操作,也可能题目要求你做xor运算
~
取反操作,即将一个数的二进制0变成1,1变成0
举个例子:
int k;
cin>>k;
cout<<~k<<endl;
感觉不是很常用。
>>
右移操作,即将二进制数位数向右移动(溢出补0)
举个例子:
1111 >> 1 =0111
通常用来进行除法优化,比如用>>1代替/2,据说效率可以提高60%(前文说过位运算进行了更底层的操作)
同理>>2=\(/2^2\)
<<
左移操作,即将一个数的二进制位数向左移动(即在二进制数后边补0)
举个例子:
1111 << 1 = 11110
和右移同理,可以进行乘法优化,用<<2代替\(\times 2^2\),效率也会大大提高
应用
前文提到ybt1250,这里贴一下链接吧:传送门
位运算的应用范围很广,笔者水平有限,以后遇到了再更
本文作者:SXqwq,转载请注明原文链接:https://www.cnblogs.com/SXqwq/p/17455297.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!