【2026年6月deepseek科普】为什么纠错码大规模使用异或门xor
异或(XOR)是什么?
一句话定义:异或是“相同得0,不同得1”的运算。
真值表(只有4种情况)
| 输入 A | 输入 B | 输出 A ⊕ B |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
例子
- 0 ⊕ 0 = 0
- 0 ⊕ 1 = 1
- 1 ⊕ 0 = 1
- 1 ⊕ 1 = 0
为什么纠错码里大面积使用异或?
原因 1:异或就是“不进位的二进制加法”
二进制加法:
1 + 1 = 10 (进位)
异或:
1 ⊕ 1 = 0 (不进位)
在计算机里,异或比加法快得多(一个时钟周期内完成),而且不需要处理进位链。
原因 2:异或能“自己撤销自己”
这是最牛的特性:
A ⊕ B ⊕ B = A
例子:
- 1011 ⊕ 0101 = 1110
- 1110 ⊕ 0101 = 1011 (回到原数)
应用:
- 编码时:校验位 = 某些消息位的异或
- 解码时:再做一次同样的异或,就能还原或检错
原因 3:异或能快速计算“奇偶”
异或结果 = 1 表示有奇数个 1,结果 = 0 表示有偶数个 1。
| 输入 | 异或结果 | 1的个数 |
|---|---|---|
| 1 ⊕ 1 | 0 | 偶数(2个) |
| 1 ⊕ 1 ⊕ 1 | 1 | 奇数(3个) |
| 1 ⊕ 0 ⊕ 1 ⊕ 0 | 0 | 偶数(2个) |
这就是奇偶校验的基础。
原因 4:硬件实现极其简单
一个异或门(XOR gate)只需要几个晶体管。
| 运算 | 晶体管数量(约) |
|---|---|
| 异或 | 6-8 个 |
| 加法(带进位) | 20-30 个 |
| 乘法 | 几百个 |
在硬盘、网卡、手机基带芯片里,要同时做几百万次校验运算,异或的硬件成本最低。
具体例子对比
不用异或(用加法)算校验
消息:1011
加法校验:1+0+1+1 = 3 → 需要存数字3(至少2位二进制),硬件复杂。
用异或算校验
消息:1011
1⊕0⊕1⊕1 = 1(因为 1⊕0=1, 1⊕1=0, 0⊕1=1)
只需存1位结果,硬件就是一个异或门。
总结
| 特性 | 为什么重要 |
|---|---|
| 不进位加法 | 快,无进位链 |
| 可逆性(自己撤销自己) | 编解码用同一套电路 |
| 计算奇偶 | 检错的基础 |
| 硬件简单 | 成本低、功耗低、速度快 |
异或 = 纠错码的“乐高积木”:简单、快速、可逆、硬件友好。
所以从重复码到循环码,从CRC到LDPC,到处都在用它。
计算二进制多项式的除法时,用异或来代替减法
你抓到了核心矛盾。异或不是除法,只是在计算二进制多项式的除法时,用异或来代替减法。
让我彻底说清楚:
一、异或和减法的关系
在普通十进制除法里
减法就是减法:10 - 3 = 7
在二进制多项式除法里
没有进位/借位,所以:
- 减法 = 加法 = 异或(因为 1-1=0,1+1=0,结果一样)
| 二进制位 | 减法 | 加法 | 异或 |
|---|---|---|---|
| 1 - 1 = 0 | 0 | 1+1=0(进位1) | 0 |
| 1 - 0 = 1 | 1 | 1+0=1 | 1 |
| 0 - 1 = 1(借位) | 1 | 0+1=1 | 1 |
关键:在模2运算中,减法和加法结果相同,都等于异或。所以可以用异或代替减法。
二、但运算过程仍然是“除法的结构”
虽然用异或代替了减法,但算法的流程是除法:
被除数 ÷ 除数 = 商 ... 余数
- 对齐除数到被除数的左边
- 如果当前位是1(表示能“除”),就异或(做减法),商记1
- 如果当前位是0,就跳过,商记0
- 移位,继续
所以:
- 运算:用异或(代替减法)
- 算法结构:是长除法
→ 说“异或除法”是为了简化的叫法,准确说是“模2多项式除法”。
三、举例区分
普通除法(10进制)
100 ÷ 3 = 33 余 1
- 运算:减法(3×3=9,10-9=1)
多项式除法(模2)
1011000 ÷ 1011 = ? 余 ?
- 运算:异或(代替减法)
- 结构:还是长除法的流程(对齐、判断、运算、移位)
四、一句话总结
| 说法 | 正确性 |
|---|---|
| “异或就是除法” | ❌ 错误 |
| “用异或来做除法” | ✅ 正确(特指模2多项式除法) |
| “循环码编码用的是除法” | ✅ 正确(算法结构是除法) |
| “循环码编码用的是异或” | ✅ 正确(具体运算是异或) |
异或是工具,除法是流程。
就像“加法是工具,乘法是流程”——几个加法拼起来就是乘法,但加法本身不等于乘法。
你提的这个问题非常好,确实是我前后说法不一致,让你困惑了。我在这里明确澄清,并道歉。
减法还是加法
一、矛盾在哪里?
我之前说了两句看似矛盾的话:
- “异或相当于加法(不进位加法)”
- “在循环码的除法里,用异或代替减法”
这让你自然会产生疑问:到底是加法还是减法?
答案是:在二进制模 2 运算中,加法和减法是一回事。
二、模 2 加法的表
| A | B | A+B (mod 2) |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
模 2 减法的表
| A | B | A-B (mod 2) |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1(因为 0-1 不够,模2下借位后等于 1) |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
看到没?两个表完全一样。
所以在模 2 运算中:
加法 ≡ 减法 ≡ 异或
三、为什么平时会说“异或相当于不进位加法”?
因为这个是从计算机硬件角度说的:
- 二进制加法:
1 + 1 = 10(最低位 0,进位 1) - 异或:
1 ⊕ 1 = 0(只保留加法结果的低位,丢掉进位)
这是大多数教材的常见说法,简单直观。
四、那为什么循环码里又说“异或代替减法”?
因为在长除法流程里,我们做的是:
当前被除数 − 除数
用普通数学,这是减法。
但在模 2 下,减法和加法结果一样,所以可以用异或实现。
所以两种说法都对,只是角度不同:
| 说法 | 角度 |
|---|---|
| 异或 = 不进位加法 | 硬件运算 |
| 异或代替减法 | 长除法流程 |
五、更准确的一句话总结
在模 2 运算中,加法和减法相同,都等于异或。
因此:
- 描述“编码公式”时,说“校验位 = 消息位的异或(加法)” ✅
- 描述“长除法过程”时,说“当前数异或除数(做减法)” ✅
两个都对,因为结果一样。
六、一个例子验证
设 A = 1011,B = 1011
- A + B (模2) = 1011 ⊕ 1011 = 0000
- A − B (模2) = 1011 ⊕ 1011 = 0000
结果相同。
最后向你道歉
我前面没有在一开始统一说明“模2下加减相同”,导致你看到“加法”和“减法”两个词产生矛盾。这是我的问题。感谢你反复追问,让这个关键点最终澄清。
更多推荐

所有评论(0)