【嵌入式C语言系列】位运算

  • Post author:
  • Post category:其他


在这里插入图片描述



按位与运算符(&)


  • 参与运算的两个操作数,每个二进制位进行“与”运算,若两个都为1,结果为1,否者为0。


例如,1011&1001,第一位都为1,结果为1;第二位都为0,结果为0;第三位一个为1,一个为0,结果为0;第四位都为1,结果为1。最后结果为1001。



按位或运算符(|)


  • 参与运算的两个操作数,每个二进制位进行“或”运算,若两个都为0,结果为1,否者为1。


例如,1011 | 1001,第一位都为1,结果为1;第二位都为0,结果为0;第三位一个为1,一个为0,结果为1;第四位都为1,结果为1。最后结果为1011。



按位取反运算符(~)


  • 按位取反运算符用于对一个二进制数按位取反。


例如,~1011,第一位为1,取反为0;第二位为0,取反为1;第三位为1,取反为0,结果为1;第四位为1,取反为0。最后结果为0100。



左移(<<)和右移(>>)运算符


  • 左移(<<)运算符用于将一个数左移若干位,右移(>>)运算符用于将一个数右移若干位。


例如,假设val为unsigned char型数据,对应的二进制数为10111001。若val=va<<3,表示val左移3位,然后赋值给val,左移过程中,高位移出去后被丢弃,低位补0,最后val结果为11001000;若val=val>>3,表示val右移3位,然后赋值给val,右移过程中,低位移出去后被丢弃,高位补0,最后val结果为00010111。



清0或置1

#define GPIOB_ODR (*(volatile unsigned int *)(0x40010C0C))


使用#define定义了GPIOB_ODR 对应的内存地址为0x40010C0C。该地址为MCU的ODR寄存器地址

GPIOB_ODR &= ~(1<<0);


GPIOB_ODR &= ~(1<<0)实际是GPIOB_ODR = GPIOB_ODR & ~(1<<0)。

先将GPIOB_ODR和~(1<<0)的进行与运算,运算结果赋值给GPIOB_ODR。

1<<0的值为00000000 00000000 00000000 00000001,再取反为11111111 11111111 11111111 11111110,则GPIO_ODR的第0位和0与运算,结果必为0,其它位和1运算,由GPIO_ODR原来的值决定结果。

这就实现了,只将GPIO_ODR的第0位清0,其它位保持不变的效果,实现了单独控制对应引脚电平输出低。

GPIOB_ODR |= (1<<0);


GPIOB_ODR |= (1<<0)实际是GPIOB_ODR = GPIOB_ODR | (1<<0)。

先将GPIOB_ODR和(1<<0)进行或运算,运算结果赋值给GPIOB_ODR。

1<<0的值为00000000 00000000 00000000 00000001,则GPIO_ODR的第0位和0或运算,结果必为1,其它位和0运算,由GPIO_ODR原来的值决定结果。这就实现了,

只将GPIO_ODR的第0位置1,其它位保持不变的效果,实现了单独控制对应引脚电平输出高。



版权声明:本文为XYF736162986原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。