位运算的基本使用
- 位运算是指按照二进制进行的运算
- 计算机所有的计算最终都是通过二进制的位运算进行的!
- 在软件开发中常常需要处理二进制位的运算
-
通过单片机、STM32等控制灯光、风扇
-
通过子网掩码求IP地址的网络号
-
通过异或对数据进行加密
-
通过位运算判断数据的奇偶性
运算符 | 描述 | 实例(A = 60, B = 30) | 结果 |
---|---|---|---|
& | 按位与操作,按二进制位进行"与"运算。运算规则:080=0;0&1=0;180=0;1&1=1 | A & B | 28, 即为 00011100 |
| | 按位或运算符,按二进制位进行"或”运算。运算规则:010=0;011=1;110=1;111=1 | A | B | 62, 即为 00111110 |
~ | 取反运算符,按二进制位进行"取反"运算。运算规則:~1=0;~0=1 | ~A | -61, 即为 11000011,一个有符号二进制数的 |
^ | 异或运算符,按二进制位进行"异或"运算。运算规则:0^0=0;0^1=1;1^0=1;1^1=0; | A ^ B | 34,即为 00100010 |
<< | 二进制左移运算符。将一个运算对象的各二进制位全部左移若千位(左边的二进制位丢弃,右边补0) | A << B | 240,即为 11110000 |
>> | 二进制右移运算符。将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃 | A >> B | 15,即方 00001111 |
位运算的骚操作
- 左移实现乘法
- 左移n位等价于乘以2的n次方
int X;
X = 2;
x = x << 2;
×=×<<3
-
使用左移实现乘法运算仅限于乘以2的倍数
-
是不是只要是左移就能够实现乘以2的倍数呢?
char × = 120;
x゠x<< 1;
- 右移实现除法
- 右移n位等价于除以2的n次方
int x = 100;
X=X >> 1;
X = X >> 3;
- 使用右移实现除法运算仅限于除以2的倍数
- 不使用中间变量交换两个整型变量的值
int a =5,b=6;
a = a+b:
b = a-b;
a = a-b;
以上代码看似可以实现两个整型变量数值的交换,但是你能看出其中的Bug吗?
int a = 5, b = 6;
a = a ^ b:
b = a ^ b;
a = a ^ b;
- 判断整数的奇偶性
× & 1
- 位操作进行高低位交换
a=(a >> 8) | (a << 8)
- 寄存器的置位
- 嵌入式系统总是要用户对变量或寄存器(8位)进行位操作。给定一个变量a,将a的第了个bit位置1 (bit位最右边的位第0位),其他位的值不变。
a = a | 0x08
将第三个bit位清零,其他位的值保持不变
a = a & (~0x08)
- 数据的"拆解〞
- 在数据的传输过程中需要对整型数据进行拆解,例如 intx=Qx1m2345678,我们需要将x分别拆解成 0×12 0×34 0×56 0×78进行传输
X & 0xFF
(x >> 8) & 0xFF (x >> 16) & 0xFF (x >> 24) & 0xFF