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