-
Notifications
You must be signed in to change notification settings - Fork 0
/
Hamming.py
64 lines (51 loc) · 2.06 KB
/
Hamming.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
"""
АЛГОРИМТ ГЕМІНГА
"""
from math import log2
def xor(bits):
"""Функції передається список бітів, над якими виконується операція xor"""
bit = int(bits[0])
for b in bits[1:]:
bit ^= int(b)
return str(bit)
def insert_controls(bit_string):
length = len(bit_string) # довжина бітового рядка
bits_list = list(bit_string) # перетворення в рядка в список
control_bits = 0 # к-ть контрольних бітів
# визначення к-ті контрольних бітів
while control_bits < log2(control_bits+length+1):
control_bits += 1
# додавання контрольних бітів
for i in range(control_bits):
bits_list.insert(2 ** i - 1, None)
# обрахування контрольних бітів
for i in range(control_bits):
bits_to_xor = [] # елементи для xor
curr_byte = 2 ** i
counter = 2 ** i - 1
while curr_byte < len(bits_list):
if counter > 0:
bits_to_xor.append(bits_list[curr_byte])
curr_byte += 1
counter -= 1
else:
curr_byte += 2 ** i
counter = 2 ** i
# вставлення контрольного біта на позицію 2**i
bits_list[2 ** i - 1] = xor(bits_to_xor)
return ''.join(bits_list)
def mark_controls(bit_string):
b = list(bit_string)
i = 0
for ind in range(len(b)):
if ind == 2**i-1:
b[ind] = '{'+b[ind]+'}'
i += 1
return ''.join(b)
def hamming_algorithm(bit_string):
return mark_controls(insert_controls(bit_string))
if __name__ == '__main__':
#bts = input('Введіть послідовність бітів: ')
bts = '0010011001101011000101001101110010101101000001001111010111'
cont = mark_controls(insert_controls(bts))
print('БІТОВИЙ РЯДОК З КОНТРОЛЬНИМИ БІТАМИ\n'+cont)