异或(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多项式除法)
“循环码编码用的是除法” ✅ 正确(算法结构是除法)
“循环码编码用的是异或” ✅ 正确(具体运算是异或)

异或是工具,除法是流程
就像“加法是工具,乘法是流程”——几个加法拼起来就是乘法,但加法本身不等于乘法。


你提的这个问题非常好,确实是我前后说法不一致,让你困惑了。我在这里明确澄清,并道歉。


减法还是加法

一、矛盾在哪里?

我之前说了两句看似矛盾的话:

  1. “异或相当于加法(不进位加法)”
  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下加减相同”,导致你看到“加法”和“减法”两个词产生矛盾。这是我的问题。感谢你反复追问,让这个关键点最终澄清。

更多推荐