Как изменить, какой индексный номер вы хотите перечислить в 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

Из этого я мог бы сложить биты в строку. Кто-нибудь может помочь?

Я надеюсь, что в этом есть смысл. Я очень новичок в кодировании, поэтому, пожалуйста, не судите.

0 ответов

Другие вопросы по тегам