Skip to content

Commit aac46ae

Browse files
[pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
1 parent 1870c0c commit aac46ae

File tree

1 file changed

+61
-17
lines changed

1 file changed

+61
-17
lines changed

bit_manipulation/hamming_code_generator.py

+61-17
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,22 @@
1-
""""
1+
""" "
22
Author: Ayush Chakraborty
33
Date: 6th October 2024
44
5-
generate (15,11) hamming encoded bits gives 11 bit data
5+
generate (15,11) hamming encoded bits gives 11 bit data
66
77
input: 11 bit binary number with type string
88
return: 16 bit binary hamming encoded number returned in string form
99
"""
1010

11+
1112
def hamming_15_11(number: str) -> str:
1213
"""
1314
Performs parity checks to assign values to the redundant bits, in the 16 bit number
1415
returned, bits at index 0, 1, 2, 4, 8 are redundant bits used for checking
1516
1617
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-
18+
a single bit change, but can only detect more than a single bit change
19+
1920
for more theoretical knowledege about Hamming codes, refer: https://www.youtube.com/watch?v=X8jsijhllIA&t=143s
2021
by 3B1B YT channel
2122
@@ -27,39 +28,82 @@ def hamming_15_11(number: str) -> str:
2728
'0011001101100110'
2829
>>> hamming_15_11("10001000010")
2930
'0001100001000010'
30-
31+
3132
"""
3233
if len(number) == 11:
33-
digits = [0 if number[i] == '0' else 1 for i in range(len(number))]
34+
digits = [0 if number[i] == "0" else 1 for i in range(len(number))]
3435
total_num_1 = sum(digits)
3536
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
37+
bit_1 = reduce(
38+
lambda x, y: x ^ y,
39+
[
40+
digits[1],
41+
digits[4],
42+
digits[8],
43+
digits[0],
44+
digits[3],
45+
digits[6],
46+
digits[10],
47+
],
48+
)
49+
bit_2 = reduce(
50+
lambda x, y: x ^ y,
51+
[
52+
digits[2],
53+
digits[5],
54+
digits[9],
55+
digits[0],
56+
digits[3],
57+
digits[6],
58+
digits[10],
59+
],
60+
)
61+
bit_3 = reduce(
62+
lambda x, y: x ^ y,
63+
[
64+
digits[1],
65+
digits[2],
66+
digits[3],
67+
digits[7],
68+
digits[8],
69+
digits[9],
70+
digits[10],
71+
],
72+
)
73+
bit_4 = reduce(
74+
lambda x, y: x ^ y,
75+
[
76+
digits[4],
77+
digits[5],
78+
digits[6],
79+
digits[7],
80+
digits[8],
81+
digits[9],
82+
digits[10],
83+
],
84+
)
85+
bit_0 = int(total_num_1 % 2) ^ bit_1 ^ bit_2 ^ bit_3 ^ bit_4
4186

4287
redundant_bits = [bit_0, bit_1, bit_2, bit_3, bit_4]
4388

4489
j = -1
4590
r = 0
4691
for k in range(16):
47-
if (k == 0 or k==1 or k==2 or k==4 or k==8):
92+
if k == 0 or k == 1 or k == 2 or k == 4 or k == 8:
4893
hamming_digits[k] = redundant_bits[r]
4994
r += 1
5095
else:
5196
j += 1
52-
hamming_digits[k] = digits[j]
97+
hamming_digits[k] = digits[j]
98+
99+
return "".join([str(i) for i in hamming_digits])
53100

54-
return ''.join([str(i) for i in hamming_digits])
55-
56101
else:
57102
return "please provide a 11 bit binary number"
58103

104+
59105
if __name__ == "__main__":
60106
from functools import reduce
61107
import doctest
62108

63109
doctest.testmod()
64-
65-

0 commit comments

Comments
 (0)