Skip to content

与、或、非、异或

你可以把 1 看作 真 (True) / 有电 / 通路,把 0 看作 假 (False) / 没电 / 断路

以下是 “与、或、非、异或” 的计算口诀和规则:

1. 与运算 (AND) —— 也就是 C 语言中的 &

口诀: “全 1 才 1,有 0 则 0”

(这就像串联电路,两个开关都得合上,灯才会亮;或者像严厉的老板:必须“做完作业”并且“打扫完房间”才能玩,少一样都不行。)

  • 1 & 1 = 1 (两个都是真,结果才真)
  • 1 & 0 = 0 (有一个是假,结果就假)
  • 0 & 1 = 0
  • 0 & 0 = 0

在 STM32 中的用途: 用来清零某一位,或者提取(检查)某一位的值


2. 或运算 (OR) —— 也就是 C 语言中的 |

口诀: “有 1 则 1,全 0 才 0”

(这就像并联电路,只要有一个开关闭合,灯就亮;或者像宽容的老板:只要“做完作业”或者“打扫完房间”其中一样,就可以玩。)

  • 1 | 1 = 1
  • 1 | 0 = 1 (只要有一个是真,结果就是真)
  • 0 | 1 = 1
  • 0 | 0 = 0 (只有两个都是假,结果才假)

在 STM32 中的用途: 用来置位(把某一位强制变成 1)。


3. 非运算 (NOT) —— 也就是 C 语言中的 ~!

口诀: “唱反调”

(黑变白,白变黑。)

  • ~1 = 0
  • ~0 = 1

4. 异或运算 (XOR) —— 也就是 C 语言中的 ^

口诀: “相同为 0,不同为 1”

(这就好比消消乐,一样的消掉归零,不一样的留下来。)

  • 1 ^ 0 = 1 (不一样,结果为 1)
  • 0 ^ 1 = 1 (不一样,结果为 1)
  • 1 ^ 1 = 0 (一样,结果为 0)
  • 0 ^ 0 = 0 (一样,结果为 0)

在 STM32 中的用途: 用来翻转电平。

如果你想让 LED 闪烁,可以用 LED_State = LED_State ^ 1。

  • 原状态是 1,1^1=0(灯灭)。
  • 原状态是 0,0^1=1(灯亮)。

总结表

运算符号 (C语言)AB结果一句话总结
与 (AND)&111都没问题才行
100
000
或 (OR)``101
000
异或 (XOR)^101必须不一样
110

C

例子

!!(Byte & (0x80 >> i))

这里面包含了复杂的逻辑,我们可以用刚才学的拆解一下(假设 i=0,检测最高位):

  1. 0x80 是二进制 1000 0000
  2. Byte & 0x80
    • 如果 Byte 是 1xxxxxxx,结果就是 10000000 (非0)。
    • 如果 Byte 是 0xxxxxxx,结果就是 00000000 (0)。
    • 这就是“与”运算的作用:屏蔽掉后面 7 位,只看第 1 位。
  3. !!:两次非运算。
    • 如果结果是 10000000!结果 = 0,!!结果 = 1。
    • 如果结果是 0!结果 = 1,!!结果 = 0。
    • 作用:把乱七八糟的非 0 数字,统一变成干净的 1。