七位记录怎样定位并纠正一次位翻转:独立演算第05例
简单校验可以提示记录出了错,但未必指出哪一位。给四位数据增加三位特定校验,可以在明确的单次位翻转假设下定位并修正错误。
七个位置从一开始编号,校验位在一、二、四位,数据在三、五、六、七位。每个校验组由位置编号对应二进制位为一的成员组成,组内采用偶数个一;收到后把失败组的编号相加,得到综合校验值。
这一例的完整输入
每行给出四位数据所代表的零至十五整数,以及翻转位置;位置零表示没有错误。
逐项计算记录
原数 | 翻转位 | 编码 | 收到 | 综合值 | 修正 | 解码 14 | 4 | 0010110 | 0011110 | 4 | 0010110 | 14 1 | 2 | 1101001 | 1001001 | 2 | 1101001 | 1 9 | 7 | 0011001 | 0011000 | 7 | 0011001 | 9 9 | 1 | 0011001 | 1011001 | 1 | 0011001 | 9 12 | 2 | 0111100 | 0011100 | 2 | 0111100 | 12 3 | 3 | 1000011 | 1010011 | 3 | 1000011 | 3 9 | 1 | 0011001 | 1011001 | 1 | 0011001 | 9 11 | 5 | 0110011 | 0110111 | 5 | 0110011 | 11
读表时先把输入与计算后的结果分开。空值表示这一步没有适用对象或没有可用结果,不应自动换成零。编号只负责识别本例中的元素,同一个数字出现在不同字段时,要先确认它代表位置、对象还是数值。
怎样复核和使用
综合值为零就不翻转,其他值则翻转对应位置,再取出四个数据位。表中每行最多翻转一位,因此可以把恢复结果与原数据逐项比较;位序必须保持一致。
这不是能纠正任意损坏的保证。若有两个或更多错误,非零综合值可能指向一个原本正确的位置;本例没有增加总校验位,不能据此声称具备可靠的双位错误检测能力。
可以先遮住记录表,只按上述规则重算前两步,再选择一个边界条件重新试算。若结果不一致,应逐项检查输入顺序、端点是否包含以及状态在哪一步更新;不要只看最终合计相同就认为中间处理也完全正确。