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

关于移位运算符

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

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

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

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

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

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

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

左移

【一看就懂】移位运算符讲解_第1张图片

右移

【一看就懂】移位运算符讲解_第2张图片

规律

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

  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)

总结

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

你可能感兴趣的:(杂七杂八小知识,C/C++)