Существует два возможных способа вернуть i-й бит байта. «Первый бит» может относиться к старшему биту или к младшему.
Вот функция, которая принимает строку и индекс в качестве параметров и возвращает значение бита в этом месте. Как написано, он рассматривает младший бит как первый бит. Если вы хотите сначала бит старшего разряда, просто раскомментируйте указанную строку.
def bit_from_string(string, index):
i, j = divmod(index, 8)
# Uncomment this if you want the high-order bit first
# j = 8 - j
if ord(string[i]) & (1 << j):
return 1
else:
return 0
Индексирование начинается с 0. Если вы хотите, чтобы индексирование начиналось с 1, вы можете настроить индекс в функции перед вызовом divmod
.
Пример использования:
>>> for i in range(8):
>>> print i, bit_from_string('\x04', i)
0 0
1 0
2 1
3 0
4 0
5 0
6 0
7 0
Теперь, как это работает:
Строка состоит из 8-битных байтов, поэтому сначала мы используем divmod (), чтобы разбить индекс на части:
i
: индекс правильного байта в строке
j
: индекс правильного бита в этом байте
Мы используем функцию ord()
для преобразования символа в string[i]
в целочисленный тип. Затем (1 << j)
вычисляет значение j-го бита, сдвигая влево на 1 на j
. Наконец, мы используем побитовое и для проверки, установлен ли этот бит. Если это так, верните 1, в противном случае верните 0.