]> git.sesse.net Git - hamming/blobdiff - hamming32.c
Fixed a missing bit in the last parity checking bitmask.
[hamming] / hamming32.c
index 9547a28d6687201e2f0bc47aeadace8f59b41edd..69619c60737e89ea3b7d1b1b2ddc3ac4304a80ba 100644 (file)
@@ -34,9 +34,9 @@ unsigned generate_parity(unsigned data)
        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)
@@ -79,15 +79,15 @@ int has_double_error(unsigned code)
        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 */