按位与运算符(&)
-
参与运算的两个操作数,每个二进制位进行“与”运算,若两个都为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,其它位保持不变的效果,实现了单独控制对应引脚电平输出高。