关于移位运算符
- 左移:"<<" ,
顾名思义将二进制数整体向左移动,多余的位数进行舍去操作(比如向左移动n位,即将二进制数的前n位舍去),舍去固然意味着要在末尾进行补充,补什么呢,联想到整数的小数点后补位,自然可以知道左移末尾补0。右移:">>"
以此类推,右移即将二进制数末尾的n位舍去,对左边的高位进行补位。问题来了,左边的高位也是补0吗?答案对了一半。我们知道整型可以基本划分为正数、0、负数。数的二进制表示法中,“0正1负”(一般来说,最高位0表示正数,最高位1表示负数),自然可以想到右移操作中,正数左边补0,负数左边补1。 - 移位运算符为双目运算符,操作数类型均为整型。如“45>>3”,对45向右移动3位。
- 移位运算符可以算是特殊的位运算符,总结来说就是对二进制数的一类操作,毕竟在计算机内部都是以二进制进行存储。
- 移位运算相对于乘法除法运算在计算机的内部效率更高(一般适用于乘上或除以2n的情形)
史上最清晰的移位操作图解
说明:此图解来源于B站一位老师讲授移位运算符的视频截图,足以让对移位运算符懵懂的你豁然开朗(传送门),如果对图解还是比较迷惑的同学,建议配合视频内容学习更佳哦,好东西一起分享!
左移

右移

规律
很显然,通过以上的图解,我们必须要记住两条规律:
- 左移相当于乘以2n
- 右移相当于除以2n
位运算符的应用总结
1.三种位运算符应用(原操作数s掩码mask)
- 按位与(&)
- 清零特定位(mask中特定位置0,其他位为1,s = s&mask)
- 取某数中指定位(mask中特定位置1,其他位为0,s = s&mask)
- 按位或(|)
常用来将原操作数某些位置1,其他位不变。(mask中特定位置1,其他位为0 s = s|mask)
- 按位异或(^)
- 使特定位的值取反(mask中特定位置1,其他位为0,s = s^mask)
- 不引入第三变量,交换两个变量的值(设a = a1,b = b1,aba = b)
- 判断奇偶性(强推!!效率更高!)
a&1 = 0 偶数
a&1 = 1 奇数 - 不用第三个变量交换两个整数
void swap(int x , int y) {
x ^= y; y ^= x; x ^= y; }
讯享网
- 取模运算转化成位运算 (在不产生溢出的情况下)
讯享网 a % (2^n) 等价于 a & (2^n - 1) //即取a的后n位
- x 的相反数表示为 (~x+1)
总结
在程序的编写中,巧用位运算符进行相关运算,可大大提高程序运行的效率。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/68849.html