位运算符
位运算符的介绍
进行位运算的时候要将数据转成二进制补码进行运算符
按位与
符号:&
格式:数据1&数据2
规则:将数据转成二进制补码,按照低位对齐,对不齐前面补0
“全1为1,有0则0”
例:10&25 ---char 型数据 ----8位
0000 1010
0001 1001
& 0000 1000 ---8
场景:将一个数据的某一位或者某几位置0
总结规律:如果想将一个数据的第n位置0,将数据&(第n位是0其他位都是1的数);如果想将一个数据的第n位和n+1置0,只需将数据&(第n位和n+1位是0其他位都是1的数)
按位或
符号:|
格式:数据1|数据2
规则:将数据转成二进制补码,按照低位对齐,对不齐的前面补0
有1则1,全0为0
例:10|25 ---char型 –8位
0000 1010
0001 1001
| 0001 1011 ---27
场景:将一个数据的某一位或者某几位置1
总结规律:如果想将一个数的第n位置1,只需要将数据|(第n位是1,其他位都是0的数),如果想将一个数据的第n位和n+1置1,只需要将数据|(第n位和n+1位是1其他位都是0的数)
按位异或
符号:^
格式:数据1^数据2
规则:将数据转成二进制补码,按照低位对齐,对不齐前面补0
不同为1,相同为0
例10^25
0000 1010
0001 1001
0001 0011 ---19
场景:推数据
按位取反
符号:~
格式:~数据
规则:将数据转成二进制补码,按照数据类型的位数进行补齐
所有位0变1,1变0
场景:辅助作用 置0
按位左移
符号:<<
格式:将数据转成二进制补码,所有位整体左移,低位补0,高位溢出舍去
场景:辅助作用,可以将1放在任意位置
按位右移
符号:>>
格式:数据>>位数
规则:将数据转成二进制补码,所有位整体右移,低位溢出舍弃,高位补符号位上的数据
场景:一般用于数据的分割
位运算符的应用
置1:|
例:将a的第4位置1,其他位不变
a | ==
???? ???? ???? ???? ???? ???? ???? 10??
| 0000 0000 0000 0000 0000 0000 0001 0000
???? ???? ???? ???? ???? ???? ???1 10??
a | (1 << 4)
将a的第4位置1,其他位不变
将a的第4位和第5位同时置1,其他位不变
???? ???? ???? ???? ???? ???? ???? ????
| 0000 0000 0000 0000 0000 0000 0011 0000
???? ???? ???? ???? ???? ???? ??11 ????
a |= (3 << 4);
置0:&
将a的第4位置0,其他位不变
???? ???? ???? ???? ???? ???? ???? 10??
& 1111 1111 1111 1111 1111 1111 1110 1111
???? ???? ???? ???? ???? ???? ???0 10??
a & (0b11111111111111111111111111101111)
变1:a & ~(0b00000000000000000000000000010000);
变2:a & ~(1 << 4);
a = a & ~(1 << 4); 或者 a &= ~(1 << 4);
判断某一位是0还是1
判断a的第5位是0还是1;
???? ???? ???? ???? ???? ???? ??1? ????
& 0000 0000 0000 0000 0000 0000 0010 0000
0000 0000 0000 0000 0000 0000 0010 0000
a & (1 << 5);
如果结果 != 0
{
对应位是1
}
否则
{
对应位上是0
}
置01或者10
思路1:分开置0置1
思路2:先将这两位清0,然后再重置01或者10
将a的第5位和第4位置01
将a的第5位和第4位置00 a &= ~(3 << 4);
将a的第5位和第4位重置01 a |= (1 << 4);
将a的第5位和第4位置10
将a的第5位和第4位置00 a &= ~(3 << 4);
将a的第5位和第4位重置10 a |= (1 << 5); 或者 a |= (2 << 4);
位翻转
将a的第4位翻转,0变1,1变0,其他位不变
???? ???? ???? ???? ???? ???? ???0 10??
^ 0000 0000 0000 0000 0000 0000 0001 0000
???? ???? ???? ???? ???? ???? ???1 10??
???? ???? ???? ???? ???? ???? ???1 10??
^ 0000 0000 0000 0000 0000 0000 0001 0000
???? ???? ???? ???? ???? ???? ???0 10??
规则:
将a的第4位翻转,0变1,1变0,其他位不变
a = a ^ (1 << 4); 或者 a ^= (1 << 4);
总结:
前提:第几位置0或者置1是从最低位作为第0位开始数
①、将a的第n位置1,公式:a |= (1 << n);
例如:将端口8配置成开漏模式:GPIO8->OTYPER |= (1 << 8);
②、将a的第n位和第n+1位同时置1,公式:a |= (3 << n);
③、将a的第n位置0 ,公式: a &= ~(1 << n);
④、将a的第n位和第n+1位同时置0,公式:a &= ~(3 << n);
⑤、判断a的第n位是0还是1,公式:a & (1 << n) 看结果,如果结果!=0 ,第n位是1,否则第n位是0
⑥、将a的第n+1位和第n位置01或者10
先清00 a &= ~(3 << n);
在重置 01 或者 10 a |= (1 << n); 或者 a |= (2 << n);
⑦、将a的第n位0变1,1变0;
a ^= (1 << n);