**奇偶校验(parity)**是在每组位上增加一个额外位,使 1 的个数始终为偶数(偶校验)或始终为奇数(奇校验)。接收方重新数 1 的个数。如果奇偶性不对,就说明出了错。
这一课建立在串行与并行传输以及数字与文本的表示中的二进制模式之上。
如何求奇偶位?
- 数出数据位中 1 的个数。
- 偶校验:让总数为偶数。如果个数是奇数,奇偶位为 1;如果是偶数,奇偶位为 0。
- 奇校验:让总数为奇数。如果个数是偶数,奇偶位为 1;如果是奇数,奇偶位为 0。
- 把奇偶位接在数据上。位置需要事先约定,本课放在末尾。
例题详解
用偶校验发送 7 位模式 1011001。
**第 1 步,数。**各位是 1,0,1,1,0,0,1,1 的个数是 4。
**第 2 步,决定。**4 已经是偶数,所以奇偶位是 0。
**第 3 步,发送。**发送的字节是 10110010。
**第 4 步,无错接收。**接收方数 10110010 中 1 的个数,又得到 4,是偶数,校验通过。
**第 5 步,一位翻转。**假设字节变成 10010010。1 的个数现在是 3,是奇数,所以接收方报告错误。
下面是用 Cambridge 风格伪代码写的同一个计数过程(7 位数据):
count ← 0
FOR i ← 1 TO 7
IF Bits[i] = 1 THEN
count ← count + 1
ENDIF
NEXT i
IF count MOD 2 = 0 THEN
parity ← 0
ELSE
parity ← 1
ENDIF
对 1011001 的追踪:i=1 后 count 为 1,i=2 仍为 1,i=3 变为 2,i=4 变为 3,i=5 仍为 3,i=6 仍为 3,i=7 变为 4。然后 4 MOD 2 = 0,所以 parity = 0,与手算相符。
学生常犯什么错误?
常见结论:“奇偶校验通过了,所以数据是正确的。”
这并不可靠。拿上面的 10110010,翻转第二位和第四位,得到 11100010。1 的个数仍是 4,校验通过,数据却是错的。更正的写法是:“奇偶校验通过,所以没有检测到错误,但偶数个位的改变仍可能被隐藏。”
自我检测
1. 求 1110110 的偶校验位。
查看答案
1 的个数:1,1,1,0,1,1,0 共 5 个。五是奇数,所以奇偶位必须是 1。完整字节为 11101101,有 6 个 1,是偶数。
2. 使用奇校验。一个字节以 01100110 到达。能检测出错误吗?
查看答案
1 的个数:0,1,1,0,0,1,1,0 共 4 个,是偶数。奇校验需要奇数个,所以检测到错误。
3. 解释为什么两位翻转可能不被检测到。
查看答案
每次翻转使 1 的个数改变一个。两次翻转可能互相抵消,个数的奇偶性不变,校验看起来就通过了。
下一步
奇偶校验是最简单的校验。下一课看覆盖整块数据的校验和(checksum)。你可以在练习题里测试自己的计数,或用受限伪代码追踪训练器逐步运行上面的循环。
如果你数得准确,但解释的措辞仍然丢分,我们的老师可以在一对一线上计算机科学补习里帮助你。