首页 > 解决方案 > 如何计算 (31,26) 的汉明码?

问题描述

我需要构造 0x444 的 (31,26) 汉明码。

在阅读了维基百科和 GeeksForGeeks 中显示的算法后,我仍然无法理解这是如何工作的,因为我的构造最终与我在互联网上找到的计算器的结果不同。

我的结果是:0100 0100 0010 0010 或 0x4422 是否正确?

据我了解:P1 = 按位 XOR(C1,C3,C5,C7,C9,C11,C13.C15,C17..) = 0

P2 = 按位异或(C2,C3,C6,C7,C10,C11,C14,C15..) = 1

P3 = 按位异或(C4,C5,C6,C7,C12,C13,C14,C15..) = 0

P4 = 按位异或(C8,C9,C10,C11,C12,C13,C14,C15..) = 0

P5 = 按位 XOR(C16,C17..) = 0

我无法理解的另一件事..如果(31,26)汉明码应该输出具有5个奇偶校验位和26个数据位的31位结果..为什么(7,4)汉明码将每个4位转换为7位表示,而不仅仅是 7 位和 3 个奇偶校验位的 1 个表示?

谢谢。

标签: algorithmnetworkinghamming-code

解决方案


是的,假设您在右手端从 1 开始对位进行编号,那么对于 (31,26) 汉明码,0x000444 被编码为 0x00004422——对于偶校验码字。

其中 C1、C2 等是代码字的第 1、2 等位,而 P1、P2 等是奇偶校验位 1、2 等。我认为更清楚地说:

  P1 = C1 = Bitwise_XOR(C3, C5, C7, C9, ...)

以便:

  Bitwise_XOR(C1, C3, C5, C7, C9, ...) == 0

等等。这甚至是平价。

您没有说您尝试了哪个“计算器”,但您看到的差异可能与您编号的目的有关。我注意到维基百科给出:

如果要编码的数据字节为 10011010,则数据字(使用_表示奇偶校验位)为 __1_001_1010,码字为 011100101010。

这显然是从左端开始计算位。

很遗憾我不明白你的第二个问题。我可以说 (31,26) 汉明码确实需要 26 位数据并添加 5 个奇偶校验位以产生 31 位代码字。并且 (7,4) 汉明码同样适用于 4 位数据、3 位奇偶校验位和 7 位代码字。


推荐阅读