Skip to content

Commit 1870c0c

Browse files
feat: Introduce hamming code generator
Introduced a new .py file which generates 16 bit hamming codes from the given 11 bit input. Additional 5 bits are redundant, used to correct single bit errors within the data bits
1 parent fcf82a1 commit 1870c0c

File tree

1 file changed

+65
-0
lines changed

1 file changed

+65
-0
lines changed
+65
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
""""
2+
Author: Ayush Chakraborty
3+
Date: 6th October 2024
4+
5+
generate (15,11) hamming encoded bits gives 11 bit data
6+
7+
input: 11 bit binary number with type string
8+
return: 16 bit binary hamming encoded number returned in string form
9+
"""
10+
11+
def hamming_15_11(number: str) -> str:
12+
"""
13+
Performs parity checks to assign values to the redundant bits, in the 16 bit number
14+
returned, bits at index 0, 1, 2, 4, 8 are redundant bits used for checking
15+
16+
Hamming generated 16 bits generated from the 11 bit binary number can only detect and change
17+
a single bit change, but can only detect more than a single bit change
18+
19+
for more theoretical knowledege about Hamming codes, refer: https://www.youtube.com/watch?v=X8jsijhllIA&t=143s
20+
by 3B1B YT channel
21+
22+
>>> hamming_15_11("00110001110")
23+
'0010101110001110'
24+
>>> hamming_15_11("10110000110")
25+
'0101001100000110'
26+
>>> hamming_15_11("10111100110")
27+
'0011001101100110'
28+
>>> hamming_15_11("10001000010")
29+
'0001100001000010'
30+
31+
"""
32+
if len(number) == 11:
33+
digits = [0 if number[i] == '0' else 1 for i in range(len(number))]
34+
total_num_1 = sum(digits)
35+
hamming_digits = [0 for i in range(16)]
36+
bit_1 = reduce(lambda x,y:x^y, [digits[1], digits[4], digits[8], digits[0], digits[3], digits[6], digits[10]])
37+
bit_2 = reduce(lambda x,y:x^y, [digits[2], digits[5], digits[9], digits[0], digits[3], digits[6], digits[10]])
38+
bit_3 = reduce(lambda x,y:x^y, [digits[1], digits[2], digits[3], digits[7], digits[8], digits[9], digits[10]])
39+
bit_4 = reduce(lambda x,y:x^y, [digits[4], digits[5], digits[6], digits[7], digits[8], digits[9], digits[10]])
40+
bit_0 = int(total_num_1%2)^bit_1^bit_2^bit_3^bit_4
41+
42+
redundant_bits = [bit_0, bit_1, bit_2, bit_3, bit_4]
43+
44+
j = -1
45+
r = 0
46+
for k in range(16):
47+
if (k == 0 or k==1 or k==2 or k==4 or k==8):
48+
hamming_digits[k] = redundant_bits[r]
49+
r += 1
50+
else:
51+
j += 1
52+
hamming_digits[k] = digits[j]
53+
54+
return ''.join([str(i) for i in hamming_digits])
55+
56+
else:
57+
return "please provide a 11 bit binary number"
58+
59+
if __name__ == "__main__":
60+
from functools import reduce
61+
import doctest
62+
63+
doctest.testmod()
64+
65+

0 commit comments

Comments
 (0)