Как изменить, какой индексный номер вы хотите перечислить в Python?
Я пытаюсь написать кодировку кода Хемминга на Python, и я застрял в той части, где мне нужно вычислить индекс для битов четности.
Код Хэмминга - это использование дополнительных битов четности для идентификации одной ошибки. Создайте кодовое слово следующим образом:
Отметьте все позиции битов, которые являются степенями двух, как биты четности. (позиции 1, 2, 4, 8, 16, 32, 64 и т. д.) Все остальные позиции битов предназначены для кодируемых данных. (позиции 3, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 17 и т. д.) Каждый бит четности вычисляет четность для некоторых битов в кодовом слове. Положение бита четности определяет последовательность битов, которые он попеременно проверяет и пропускает.
Позиция 1: проверка 1 бита, пропуск 1 бита, проверка 1 бита, пропуск 1 бита и т. Д. (1,3,5,7,9,11,13,15,...)
Позиция 2: проверить 2 бита, пропустить 2 бита, проверить 2 бита, пропустить 2 бита и т. Д. (2,3,6,7,10,11,14,15,...)
Позиция 4: проверить 4 бита, пропустить 4 бита, проверить 4 бита, пропустить 4 бита и т. Д. (4,5,6,7,12,13,14,15,20,21,22,23,...)
Позиция 8: проверить 8 бит, пропустить 8 бит, проверить 8 бит, пропустить 8 бит и т. Д. (8-15,24-31,40-47,...)
Положение 16: проверка 16 битов, пропуск 16 битов, проверка 16 битов, пропуск 16 битов и т. Д. (16-31,48-63,80-95,...)
Позиция 32: проверить 32 бита, пропустить 32 бита, проверить 32 бита, пропустить 32 бита и т. Д. (32-63,96-127,160-191,...) и т. Д.
Установите бит четности на 1, если общее число единиц в позициях, которые он проверяет, является нечетным. Установите бит четности на 0, если общее число единиц в позициях, которые он проверяет, является четным.
По сути, мне нужно генерировать биты четности в индексах:
P1 = [1,3,5,7,9,11 и т. Д.]
P2 = [2,3,6,7,10,11 и т. Д.]
P3 = [4,5,6,7,12,13 и т. Д.]
P4 = [8,9,10,11,12,13,14,15,24 и т. Д.]
Как только они найдены, мне нужно сложить биты, изменить их на 2 и вставить в правильную позицию.
Мой код, чтобы найти, куда вставить
# Function to calculate Hamming code
def hamming(number):
print("Hamming Code - Beginning to encode. ")
listP = half_ham(number)
print("Inserting P at relevant indices: ", listP)
encode = []
print("Length of messgae: ",len(listP), "bits.")
index = []
for i, j in enumerate(listP, start = 1):
print("i", i)
if isPowerOfTwo(i):
index = gen_indices(i, len(listP))
c = [ listP[i] for i in index]
print("C: ", c)
# Function to insert P at positions which are powers of 2
def half_ham(bin_str):
parity_positions = [2**i for i in range(0, len(bin_str))]
ret = []
current_index = 1
indexDict = {}
while (len(bin_str) > 0):
if current_index in parity_positions:
ret.append('P')
else:
ret.append(bin_str[0])
bin_str = bin_str[1:]
current_index += 1
return ret
Входные данные:
hamming("10101010")
Токовый выход:
Hamming Code - Beginning to encode.
Inserting P at relevant indices: ['P', 'P', '1', 'P', '0', '1', '0', 'P', '1', '0', '1', '0']
Length of message: 12
Теперь мне нужно найти правильные индексы четности (P1, P2, P3, как указано выше).
Первоначально я пытался создать индекс с помощью цикла while. Это работает, пока я не получу список вне диапазона ошибки. Плюс это едва читаемо.
# Function to get a list of the indexes
def gen_indices(x, y):
jump = x
current = x
index = []
while current <= y:
index.extend(list(range(current, current+jump)))
print("before current:",current)
current += jump * 2
return index
Сейчас я пытаюсь использовать функцию перечисления, чтобы получить список нужных индексов. Что-то вроде:
def index(x, listP):
for x, y in enumerate(listP, start = x):
print(x,y)
Желаемый результат будет:
P1 = 1 P P2 = 2 P 3 1 3 1 5 0 6 1 7 1 7 1
Из этого я мог бы сложить биты в строку. Кто-нибудь может помочь?
Я надеюсь, что в этом есть смысл. Я очень новичок в кодировании, поэтому, пожалуйста, не судите.