这个按位汉明(31,26)编码器如何在 C 中工作? (位掩码)

Posted

技术标签:

【中文标题】这个按位汉明(31,26)编码器如何在 C 中工作? (位掩码)【英文标题】:How does this bitwise hamming(31,26) encoder work in C? (Bitmasking) 【发布时间】:2022-01-06 09:48:01 【问题描述】:

我了解各个操作是什么(例如按位 AND 和 OR),但我不明白为什么它们一直在使用。

另外,我的理解是第一组掩码用于计算奇偶校验位。但我不明白为什么选择了第二套口罩,也不明白它们的目的是什么。谁能帮我解决这个问题?

rawData 是要被 hamming.c 函数编码的输入词。

【问题讨论】:

什么是HC_WORD0b...__builtin_popcount 是非标准的。你用的是什么编译器? Px_m 常量看起来不对劲。请提供使用上下文或有关它们的更多信息。 我正在使用 GCC。 Popcount 是一个 GCC 函数,用于计算二进制 int 中的个数。 不仅代码很糟糕,因为它很复杂并且有零个 cmets,甚至 if register 关键字也可以做任何事情,它被应用了五个六次到常数,每个使用一次。我希望这段代码不是来自试图教 C 的人... @AndrewHenle 从“通用编码”的角度来看,我同意。但是,对于了解主题(汉明码)的人来说,功能是相当清楚的。该功能的应用很可能是在性能至关重要且性能明显优先于可移植性的环境中。我同意将P0_mP1_m 等放入registers 似乎很奇怪。即使__builtin_popcount() 是一个宏,似乎也不太可能获得任何东西。我想最好将P0P1,等放在寄存器中。 【参考方案1】:

对[31,26] Hamming code进行编码,函数hammingEncode()通过在位置0、1、3、7和15插入5个奇偶校验位(从0开始计数位)来编码由26个消息位组成的消息rawData )。

您询问的部分的目的:

  unsigned int mask1 = 0b11111111111111100000000000;
  unsigned int mask2 = 0b00000000000000011111110000;
  unsigned int mask3 = 0b00000000000000000000001110;
  unsigned int mask4 = 0b00000000000000000000000001;

  encodedData |= (rawData & mask1) << 5;
  encodedData |= (rawData & mask2) << 4;
  encodedData |= (rawData & mask3) << 3;
  encodedData |= (rawData & mask4) << 2;

分别使用mask1mask2mask3mask4将26个消息位移动到正确的位置:16-30、8-14、4-6和2。

之后,奇偶校验位被计算并插入到它们的正确位置。

【讨论】:

@UpDownStrange 是的,应该是等价的。

以上是关于这个按位汉明(31,26)编码器如何在 C 中工作? (位掩码)的主要内容,如果未能解决你的问题,请参考以下文章

我如何使这个字符功能在java中工作

char* argv[] 如何在 c/c++ 中工作? [复制]

ACID 如何在宁静的微服务架构中工作

如何让这个命令行脚本在 TeamCity 中工作?

在 Android 8.0 中未创建外部目录文件夹,但当目标 SDK 版本为 26 时,它在 6.0 和 7.0 设备中工作

让 Loki Singleton 在 VS 2008 C++ 的 DLL 中工作