unsigned parity3 = find_parity_32(data & 0x01c78f0f);
unsigned parity4 = find_parity_32(data & 0x003f80ff);
unsigned parity5 = find_parity_32(data & 0x00007fff);
- unsigned parity6 = find_parity_32(data);
+ unsigned parity6 = find_parity_32(data & 0x03b4e996);
- return parity6 | (parity5 << 1) | (parity4 << 2) | (parity3 << 3) | (parity4 << 4) | (parity5 << 5);
+ return parity6 | (parity5 << 1) | (parity4 << 2) | (parity3 << 3) | (parity2 << 4) | (parity1 << 5);
}
unsigned make_codeword(unsigned data)
unsigned extra_parity = find_parity_32(code);
/* no errors at all (user should have used has_error() first; boo, hiss) */
- if (hamming_parity == gen_hamming_parity && extra_parity == 0)
+ if (hamming_parity == gen_hamming_parity && extra_parity == 1)
return 0;
/* both hamming and simple parity errors; this is a single-bit error */
- if (hamming_parity != gen_hamming_parity && extra_parity == 1)
+ if (hamming_parity != gen_hamming_parity && extra_parity == 0)
return 0;
/* hamming says OK, but simple parity indicates an error => simple parity error is wrong */
- if (hamming_parity == gen_hamming_parity && extra_parity == 1)
+ if (hamming_parity == gen_hamming_parity && extra_parity == 0)
return 0;
/* hamming says error, simple parity says OK => DOUBLE ERROR */