按位操作符
按位与(&):1 & 0 = 0,0 & 0 = 0 ,1 & 1 = 1
按位或(|):1 | 1 = 1,1 | 0 = 1,0 | 0 = 0
按位异或(^):1 ^ 0 = 1,1 ^ 1 = 0 ,0 ^ 0 = 0 (不同为1,相同为0)
异或应用:交换两个整型变量的值,并且不使用第三方中间变量
方法一:
int main()
{
int a = 3;int b = 5;
a = a + b;
b = a - b;
a = a - b;
return 0;
}
方法一缺点:如果数值太大,相加后可能会造成int型溢出,导致数值丢失,一般不采用
方法二:使用异或的方法
int main()
{
int a = 3;int b = 5;
a = a ^ b;
b = a ^ b;
a = a ^ b;
return 0;
}
&(按位与) 、l(按位或)在嵌入式中的常用方式
&:
作用一:屏蔽
A& 0 ----> 0
int a = 0x1234;
a & 0xff00; //屏蔽低8bit,取出高8bit
A&1 —>A
作用二:取出
所以&在硬件中又叫做 清零器 clr
|:
A | 0 ===A -> 保留
A | 1 === 1 -> 设置为高电平的方法,设置set
例子:
1.设置一个资源的bit5为高电平,其他位不变
int a;
(bit5 ,1后面有5个0,从0bit开始)
a = a | 100000 ===> a =(a | (0x01<<5));(一般这样写,将1左移到bit5的位置,然后或运算)
总结:a | (0x01<<n):第n位设高电平,其他位保持不变
2.清除第5位(&运算)
int a;
a= a & 0 11111 31 ==> a & 31 :这样写的话,32位系统的高位可能会被修改,而且这样固定数值的可移植性差;
所以最好写成这样:~(0x01<<5):先把1左移5位,然后取反,第5位就变为0,其余位都是1,即 a = a & ~(0x01<<5);
总结:a & (~(0x01<<n)):第n位设低电平,其他位保持不变