c语言位运算

按位与运算 &

&0是屏蔽该位(使该位清0),&1是该位不变

常用来查看或分离某一位的值

举例

1
2
3
4
TIM2ch1_cap_sta&0x40

# 0x40 0100 0000
# 第七位是捕获到高电平标志位,和0x40&就是为了查看TIM2ch1_cap_sta第七位是不是1,是不是捕获到了高电平

按位或运算 |

|0是不变,|1是置1

常用来把某一位设置为1

举例

1
2
3
TIM2ch1_cap_sta |= 0x80;
# 0x80 1000 0000
# 时间太长了无法计数了,强制拔第八位置1,使这次捕获完成

按位异或 ^

^0是不变,^1是反转

常用来反转某一位的值,比如把0变成1,1变成0

1
2
0000 1111 & 0000 0011 = 0000 0011
# 1111的前两位被翻转为0

异或运算的四条性质

  1. 任意一个变量X与其自身进行异或运算,结果为0,即X^X=0

  2. 任意一个变量X与0进行异或运算,结果不变,即X^0=X

  3. 异或运算具有可结合性,即a^b^c=(a^b)^c=a^(b^c)

  4. 异或运算具有可交换性,即a^b=b^a

左移 <<

向左移动相应的位数

1
2
1 1 1 1 1 1 1 1 << 1  ----> 
1 1 1 1 1 1 1 0

右移 >>

向右移动相应的位数

1
2
1 1 1 1 1 1 1 1  >> 1     ---->
0 1 1 1 1 1 1 1

综合运用举例

设置寄存器的值

1
2
GPIOA -> CRL &= 0XFFFFFF0F;// 将第 4-7 位清 0
GPIOA -> CRL |= 0X00000040;// 设置相应位的值,且不改变其他位的值

移位操作提高代码可读性

1
2
3
4
GPIOx -> BSRR = (((uint32_t)0x01) << pinpos);
# 0x01 0000 0001
# 这行代码可以直观明了的知道,是将第 pinpos 位设置为 1
GPIOA -> ORT |= 1<<5;// PA.5 输出高,不改变其他位