【问题标题】:Parity Lookup Table generation奇偶查找表生成
【发布时间】:2019-05-27 07:25:21
【问题描述】:

我正在通过以下链接阅读一些用于计算奇偶校验的小技巧:Bit Twiddling Hacks

对于计算奇偶校验,有一种查找方法,它为从 0 到 255 的整数生成奇偶校验表,其中包含 5 行代码。

#define P2(n) n, n ^ 1, n ^ 1, n 
#define P4(n) P2(n), P2(n ^ 1), P2(n ^ 1), P2(n) 
#define P6(n) P4(n), P4(n ^ 1), P4(n ^ 1), P4(n) 
#define LOOK_UP P6(0), P6(1), P6(1), P6(0)

unsigned int table[256] = { LOOK_UP };

我检查了计算 [0..15] 的奇偶校验的值 P2(n) 和 P4(n)。但我不明白这些代码行背后的直觉。这些行如何计算 [0..255] 的奇偶校验?我想知道这种递归方法背后的直觉和理论。提前致谢。

【问题讨论】:

  • 由于所有这些代码在使用 C 编译时都存在,我建议将其重新标记为 C。在现代 C++ 中,可以使用constexpr 来制作此表

标签: c bit parity


【解决方案1】:

对于 P2,位设置为 1 的奇偶校验是微不足道的:

0b00 -> 0
0b01 -> 1
0b10 -> 1
0b11 -> 0

添加 00 不会改变奇偶校验,
但在下一个 01 更改奇偶校验之前添加:

0b0100 -> 1 // 0 ^ 1
0b0101 -> 0 // 1 ^ 1
0b0110 -> 0 // 1 ^ 1
0b0111 -> 1 // 0 ^ 1

0b10.. 的奇偶校验与0b01.. 相同,并且将再次更改为0b11..

n ^ 1允许切换:

n | n ^ 1
--|--------
0 | 1
1 | 0

或者!n可能已被选择或其他公式与同一个表

希望您现在看到这种模式。

【讨论】:

  • 0x0100,这是二进制还是十六进制?如果这是二进制,则第二个代码不保存奇偶校验块不保存。
  • 我的意思是二进制,前缀和错字已修复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-20
  • 1970-01-01
  • 2016-04-21
  • 2016-10-19
  • 2019-09-18
相关资源
最近更新 更多