1. 简介

在本文中,我们将学习一种简单但实用的技术:奇偶校验(Parity Checking),用于检测二进制字符串传输过程中的错误。

尽管这种方法相对简单且存在一定的局限性,但在许多场景中仍然被广泛使用,例如从磁带读取数据、主存存储等。它通过在原始数据中添加一个额外的“校验位”来实现错误检测。

2. 奇偶校验与校验位

假设我们有一个消息 M,它被编码为一个 8 位的二进制字符串(1 字节):

$$ M \equiv b_1b_2b_3b_4b_5b_6b_7b_8 $$

在传输过程中,可能会发生位翻转(bit flip)等错误。为了检测错误,发送方会在每个字节后添加一个额外的位 p,称为奇偶校验位(Parity Bit)

规则如下:

  • 如果该字节中 1 的个数是偶数,则 p = 0
  • 如果该字节中 1 的个数是奇数,则 p = 1

因此,发送的消息 M_s 实际上是:

$$ M_s = Mp \equiv b_1b_2b_3b_4b_5b_6b_7b_8p $$

接收方收到数据后,会重新计算这 9 位(8 个数据位 + 1 个校验位)中 1 的总数,判断其是否为偶数,从而判断是否出错。

3. 奇偶校验的错误检测能力

接收方通过统计接收到的每一位中 1 的个数来进行校验。如果总数为奇数(即校验失败),则说明传输过程中发生了错误。

⚠️ 但这种方法存在一个明显的缺陷:如果传输中恰好有偶数个位发生错误,那么奇偶性不变,错误将无法被检测到。

✅ 举例来说:

  • 正确数据:00110110,校验位为 0
  • 接收数据变为:00110000(第 6 和 7 位出错),此时 1 的个数仍为偶数,系统将误判为无误

所以,奇偶校验只能检测奇数个错误,不能用于检测偶数个错误。

4. 奇偶校验位的计算方法

4.1. 无错误情况

发送方计算奇偶校验位的方法是:对所有 8 位数据位进行异或(XOR)操作:

$$ p = b_1 \oplus b_2 \oplus b_3 \oplus b_4 \oplus b_5 \oplus b_6 \oplus b_7 \oplus b_8 $$

举个例子:

  • 数据位为:00110110
  • 计算:0 ⊕ 0 ⊕ 1 ⊕ 1 ⊕ 0 ⊕ 1 ⊕ 1 ⊕ 0 = 0
  • 校验位 p = 0
  • 发送数据变为:001101100

接收方收到后,同样对所有 9 位进行异或:

  • 如果结果为 0:说明无误
  • 如果结果为 1:说明有误

4.2. 出现错误的情况

继续以上例说明,假设第 7 位由 1 变为 0

  • 接收到的数据为:001101000
  • 异或计算:0 ⊕ 0 ⊕ 1 ⊕ 1 ⊕ 0 ⊕ 1 ⊕ 0 ⊕ 0 ⊕ 0 = 1
  • 结果不为 0,说明出错

4.3. 奇偶校验失效的情况

当有偶数个位出错时,奇偶性不变,校验失败。例如:

  • 原始数据:11010110,校验位为 1,即发送数据为:110101101
  • 接收数据变为:000101101(第 1 和 2 位出错)
  • 异或计算:0 ⊕ 0 ⊕ 0 ⊕ 1 ⊕ 0 ⊕ 1 ⊕ 1 ⊕ 0 ⊕ 1 = 1
  • 结果仍为 1,系统误判为无误

⚠️ 这说明奇偶校验无法检测偶数个错误。

5. 小结

  • ✅ 奇偶校验是一种简单、快速的错误检测机制
  • ❌ 无法检测偶数个错误
  • ✅ 实现简单,适用于对可靠性要求不高的场景
  • ⚠️ 不能用于错误纠正(仅能检测)

如果你需要更强大的错误检测与纠正机制,可以考虑使用 汉明码(Hamming Code) 等方法。

奇偶校验虽然简单,但仍然是计算机系统中常用的错误检测手段之一,尤其在硬件层面的通信中较为常见。掌握其原理和局限性,有助于我们在实际开发中做出更合理的技术选型。


原始标题:Calculating the Parity Bit of a Bit Sequence