位运算

27 阅读2分钟

位运算的基本使用

  1. 位运算是指按照二进制进行的运算
  2. 计算机所有的计算最终都是通过二进制的位运算进行的!
  3. 在软件开发中常常需要处理二进制位的运算
  •  通过单片机、STM32等控制灯光、风扇
    
  •  通过子网掩码求IP地址的网络号
    
  •  通过异或对数据进行加密
    
  •  通过位运算判断数据的奇偶性
    
运算符描述实例(A = 60, B = 30)结果
&按位与操作,按二进制位进行"与"运算。运算规则:080=0;0&1=0;180=0;1&1=1A & B28, 即为 00011100
按位或运算符,按二进制位进行"或”运算。运算规则:010=0;011=1;110=1;111=1A | B62, 即为 00111110
取反运算符,按二进制位进行"取反"运算。运算规則:~1=0;~0=1~A-61, 即为 11000011,一个有符号二进制数的
^异或运算符,按二进制位进行"异或"运算。运算规则:0^0=0;0^1=1;1^0=1;1^1=0;A ^ B34,即为 00100010
<<二进制左移运算符。将一个运算对象的各二进制位全部左移若千位(左边的二进制位丢弃,右边补0)A << B240,即为 11110000
>>二进制右移运算符。将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃A >> B15,即方 00001111

位运算的骚操作

  1. 左移实现乘法
  • 左移n位等价于乘以2的n次方
int X;
X = 2;
x = x << 2;
×=×<<3
  • 使用左移实现乘法运算仅限于乘以2的倍数

  • 是不是只要是左移就能够实现乘以2的倍数呢?

char × = 120;
x゠x<< 1;
  1. 右移实现除法
  • 右移n位等价于除以2的n次方
int x = 100;
X=X >> 1;
X = X >> 3;
  • 使用右移实现除法运算仅限于除以2的倍数
  1. 不使用中间变量交换两个整型变量的值
int a =5,b=6a = a+b:
b = a-b;
a = a-b;

以上代码看似可以实现两个整型变量数值的交换,但是你能看出其中的Bug吗?

int a = 5, b = 6;
a = a ^ b:
b = a ^ b;
a = a ^ b;
  1. 判断整数的奇偶性
× & 1
  1. 位操作进行高低位交换
a=(a >> 8) | (a << 8)
  1. 寄存器的置位
  • 嵌入式系统总是要用户对变量或寄存器(8位)进行位操作。给定一个变量a,将a的第了个bit位置1 (bit位最右边的位第0位),其他位的值不变。
a = a | 0x08

将第三个bit位清零,其他位的值保持不变

a = a & (~0x08)
  1. 数据的"拆解〞
  • 在数据的传输过程中需要对整型数据进行拆解,例如 intx=Qx1m2345678,我们需要将x分别拆解成 0×12 0×34 0×56 0×78进行传输
X & 0xFF
(x >> 8) & 0xFF (x >> 16) & 0xFF (x >> 24) & 0xFF