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