与、或、非、异或
你可以把 1 看作 真 (True) / 有电 / 通路,把 0 看作 假 (False) / 没电 / 断路。
以下是 “与、或、非、异或” 的计算口诀和规则:
1. 与运算 (AND) —— 也就是 C 语言中的 &
口诀: “全 1 才 1,有 0 则 0”
(这就像串联电路,两个开关都得合上,灯才会亮;或者像严厉的老板:必须“做完作业”并且“打扫完房间”才能玩,少一样都不行。)
1 & 1 = 1(两个都是真,结果才真)1 & 0 = 0(有一个是假,结果就假)0 & 1 = 00 & 0 = 0
在 STM32 中的用途: 用来清零某一位,或者提取(检查)某一位的值
2. 或运算 (OR) —— 也就是 C 语言中的 |
口诀: “有 1 则 1,全 0 才 0”
(这就像并联电路,只要有一个开关闭合,灯就亮;或者像宽容的老板:只要“做完作业”或者“打扫完房间”其中一样,就可以玩。)
1 | 1 = 11 | 0 = 1(只要有一个是真,结果就是真)0 | 1 = 10 | 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语言) | A | B | 结果 | 一句话总结 |
|---|---|---|---|---|---|
| 与 (AND) | & | 1 | 1 | 1 | 都没问题才行 |
| 1 | 0 | 0 | |||
| 0 | 0 | 0 | |||
| 或 (OR) | ` | ` | 1 | 0 | 1 |
| 0 | 0 | 0 | |||
| 异或 (XOR) | ^ | 1 | 0 | 1 | 必须不一样 |
| 1 | 1 | 0 |
C
例子
!!(Byte & (0x80 >> i))这里面包含了复杂的逻辑,我们可以用刚才学的拆解一下(假设 i=0,检测最高位):
0x80是二进制1000 0000。Byte & 0x80:- 如果 Byte 是
1xxxxxxx,结果就是10000000(非0)。 - 如果 Byte 是
0xxxxxxx,结果就是00000000(0)。 - 这就是“与”运算的作用:屏蔽掉后面 7 位,只看第 1 位。
- 如果 Byte 是
!!:两次非运算。- 如果结果是
10000000,!结果= 0,!!结果= 1。 - 如果结果是
0,!结果= 1,!!结果= 0。 - 作用:把乱七八糟的非 0 数字,统一变成干净的 1。
- 如果结果是