【一看就懂】移位运算符讲解

关于移位运算符

  1. 左移:"<<" ,
    顾名思义将二进制数整体向左移动,多余的位数进行舍去操作(比如向左移动n位,即将二进制数的前n位舍去),舍去固然意味着要在末尾进行补充,补什么呢,联想到整数的小数点后补位,自然可以知道左移末尾补0

    右移:">>"
    以此类推,右移即将二进制数末尾的n位舍去,对左边的高位进行补位。问题来了,左边的高位也是补0吗?答案对了一半。我们知道整型可以基本划分为正数、0、负数。数的二进制表示法中,“0正1负”(一般来说,最高位0表示正数,最高位1表示负数),自然可以想到右移操作中,正数左边补0,负数左边补1

  2. 移位运算符为双目运算符,操作数类型均为整型。如“45>>3”,对45向右移动3位。

  3. 移位运算符可以算是特殊的位运算符,总结来说就是对二进制数的一类操作,毕竟在计算机内部都是以二进制进行存储。

  4. 移位运算相对于乘法除法运算在计算机的内部效率更高(一般适用于乘上或除以2n的情形)

史上最清晰的移位操作图解

说明:此图解来源于B站一位老师讲授移位运算符的视频截图,足以让对移位运算符懵懂的你豁然开朗(传送门),如果对图解还是比较迷惑的同学,建议配合视频内容学习更佳哦,好东西一起分享!

左移

在这里插入图片描述

右移

在这里插入图片描述

规律

很显然,通过以上的图解,我们必须要记住两条规律:

  1. 左移相当于乘以2n
  2. 右移相当于除以2n

位运算符的应用总结

1.三种位运算符应用(原操作数s掩码mask)

  1. 按位与(&)
  1. 清零特定位(mask中特定位置0,其他位为1,s = s&mask)
  2. 取某数中指定位(mask中特定位置1,其他位为0,s = s&mask)
  1. 按位或(|)

常用来将原操作数某些位置1,其他位不变。(mask中特定位置1,其他位为0 s = s|mask)

  1. 按位异或(^)
  1. 使特定位的值取反(mask中特定位置1,其他位为0,s = s^mask)
  2. 不引入第三变量,交换两个变量的值(设a = a1,b = b1,aba = b)
  1. 判断奇偶性(强推!!效率更高!)
    a&1 = 0 偶数
    a&1 = 1 奇数

  2. 不用第三个变量交换两个整数

    void swap(int x , int y)
    {
         x ^= y;
         y ^= x;
         x ^= y;
    }
  1. 取模运算转化成位运算 (在不产生溢出的情况下)
   a % (2^n) 等价于 a & (2^n - 1) //即取a的后n位
  1. x 的相反数表示为 (~x+1)

总结

在程序的编写中,巧用位运算符进行相关运算,可大大提高程序运行的效率。

  • 13
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值