模拟信号经过滤波、放大,最终要变成 0 和 1 才能进计算机——而 0 和 1 的所有运算,底层都是逻辑门。这篇讲六大基本逻辑门、真值表、德摩根定律,以及它们和编程位运算的一一对应(你其实天天在用)。
文中真值表、德摩根定律、半加器用 Python 程序验证(9 项 PASS),不是纸面推导。
一、为什么程序员要懂逻辑门
你可能天天写 a & b、a | b、a ^ b、~a——这就是位运算。而位运算在硬件上就是逻辑门:CPU 里几十亿个晶体管,组合起来就是一堆与门、或门、非门。搞懂逻辑门 = 搞懂你写的位运算在硅片上发生了什么。
二、六大基本逻辑门
| 门 | 符号(电路/编程) | 真值表 | 一句话 |
|---|---|---|---|
| 与 AND | & | 全 1 才 1 | 两个条件都满足 |
| 或 OR | | | 有 1 就 1 | 任一条件满足 |
| 非 NOT | ~ | 1↔0 翻转 | 取反 |
| 异或 XOR | ^ | 相同 0,不同 1 | 相异才 1(减法/校验用) |
| 与非 NAND | ~(A&B) | 与的取反 | 全 1 才 0 |
| 或非 NOR | ~(A|B) | 或的取反 | 有 1 就 0 |
关键点:
- NAND/NOR 是"万能门"——任何逻辑电路都能只用 NAND(或只用 NOR)搭出来。历史上 7400 系列芯片就靠 NAND 打天下
- XOR 是"比较器":
a^b == 0就是判断 a、b 相等;奇偶校验就是全部位 XOR - 真值表是逻辑门的"行为规范",任何输入组合 → 唯一输出
三、布尔代数:逻辑门的运算法则
逻辑门服从一套代数规则——布尔代数。最重要的两条:
德摩根定律:
(A·B)' = A' + B' 与的取反 = 各取反的或
(A+B)' = A' · B' 或的取反 = 各取反的与程序员的直觉版本:!(a && b) == (!a) || (!b)、!(a || b) == (!a) && (!b)——写代码判空时经常用到(比如"不是(在A且不在B)"改写)。Python 验证:
python
for a, b in [(0,0),(0,1),(1,0),(1,1)]:
assert (0 if (a & b) else 1) == ((1^a) | (1^b)) # (A·B)' = A'+B'
assert (0 if (a | b) else 1) == ((1^a) & (1^b)) # (A+B)' = A'·B'
# 9 项 PASS(6 真值表 + 德摩根 + 半加器)其他常用定律:交换律、结合律、分配律、吸收律(A + A·B = A)——和代数很像,但不完全一样(比如 A + A' = 1、A·A' = 0)。
四、逻辑门搭出加法器:半加器
逻辑门不是玩具——CPU 的加法器就是这么搭出来的。1 位半加器只要两个门:
和 S = A XOR B (1+1=0 进 1,异或正好)
进位 C = A AND B (只有 1+1 才进位)Python 验证:
0 + 0 = 和0 进位0 0 + 1 = 和1 进位0
1 + 0 = 和1 进位0 1 + 1 = 和0 进位1 ← 1+1=2(二进制 10)两个半加器 + 一个或门 = 全加器(带进位输入),串联 32 个全加器 = 32 位加法器——你的电脑就是这么加法的。
五、逻辑门 → 触发器 → 记忆
逻辑门只能"算"不能"记"(输出完全由当前输入决定,是无状态电路)。要记忆,需要触发器(Flip-Flop):两个门交叉反馈,就能"锁存"一位状态——这是寄存器、SRAM、CPU 状态机的基础(下一篇展开)。
