]> git.sesse.net Git - hamming/commitdiff
Rewrite the double-error detection in hamming32.
authorSteinar H. Gunderson <sgunderson@bigfoot.com>
Thu, 2 Mar 2006 14:18:59 +0000 (14:18 +0000)
committerSteinar H. Gunderson <sgunderson@bigfoot.com>
Thu, 2 Mar 2006 14:18:59 +0000 (14:18 +0000)
hamming32.c

index 9b8576b2a04631be46e8ca29600209f3ccbedd89..6cbd153732d3516e9af67ca1a29e53cee0b4d6e4 100644 (file)
@@ -52,28 +52,8 @@ int has_error(unsigned code)
 
 int has_double_error(unsigned code)
 {
-       unsigned data = code >> PARITY_BITS;
-       unsigned parity = code & ((1 << PARITY_BITS) - 1);
-       unsigned gen_parity = generate_parity(data);
-
-       unsigned hamming_parity = parity >> 1;
-       unsigned gen_hamming_parity = gen_parity >> 1;
-       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)
-               return 0;
-
-       /* both hamming and simple parity errors; this is a single-bit error */
-       if (hamming_parity != gen_hamming_parity && extra_parity == 1)
-               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)
-               return 0;
-
-       /* hamming says error, simple parity says OK => DOUBLE ERROR */
-       return 1;
+       unsigned parity_diff = generate_parity(code >> PARITY_BITS) ^ code;
+       return (parity_diff & ((1 << PARITY_BITS) - 1)) && !find_parity_32(code);
 }
 
 /* Correct any single-bit error -- assumes there are no double-bit errors */