gcc 对int或uint类型的数据执行此操作!

wvyml7n5  于 2023-11-19  发布在  其他
关注(0)|答案(1)|浏览(97)

我对ESP 32-IDF自动生成的代码有一个问题,在一个闪光灯的示例代码中,以下代码用于默认翻转引脚电平

static uint8_t led_state = 0;

...

led_state = !led_state;  toggle the pin state

字符串
如何理解这里的“!”操作
我写了一个这样的小程序

#include <stdio.h>
#include <stdint.h>

int main(void)
{
    uint8_t i = 2;
    printf("i = %d\n", i);
    i = !i;
    printf("i toggled\n");
    printf("i = %d\n", i);
    i = !i;
    printf("i toggled\n");
    printf("i = %d\n", i);
    return 0;
}


并且输出是

i = 2
i toggled
i = 0
i toggled
i = 1

z31licg0

z31licg01#

!是逻辑非运算符。

  • 如果它的操作数不等于零(即如果它是真值),则返回0(假值)。
  • 如果它的操作数等于零(即,如果它是一个假值),则返回1(一个真值)。

C logical operators
如果需要设置特定位,可以使用移位。

led_state = !led_state;            // Toggle the state.
uint8_t bitmask = led_state << 1;  // 1 or 0 => 2 or 0.

字符串
如果要切换特定位,可以使用异或。

bitmask ^= 1 << 2;                 // Toggle the second bit directly.

相关问题