Hay dos maneras posibles para devolver el i-ésimo bit de un byte. El "primer bit" podría referirse al bit de orden superior o podría referirse al bit de orden inferior.
Aquí hay una función que toma una cadena e índice como parámetros y devuelve el valor del bit en esa ubicación. Como está escrito, trata el bit de orden bajo como el primer bit. Si quiere primero el bit de orden alto, simplemente elimine el comentario de la línea indicada.
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
La indexación comienza en 0. Si desea que la indexación para empezar a 1, se puede ajustar el índice de la función antes de llamar divmod
.
Ejemplo de uso:
>>> 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
Ahora, por como funciona:
Una cadena se compone de bytes de 8 bits, por lo que primero usamos DIVMOD() para romper el índice en a partes:
i
: el índice del byte correcta dentro de la cadena
j
: el índice de la broca correcta w entro de ese byte
Utilizamos la función ord()
para convertir el carácter en string[i]
en un tipo entero. Luego, (1 << j)
calcula el valor del bit j-ésimo por desplazamiento a la izquierda 1 por j
. Finalmente, usamos bitwise-y para probar si ese bit está configurado. Si es así, devuelva 1; de lo contrario, devuelva 0.
Probado esto (por cierto, el byte es little endian) y ord ('\ x04') devuelve 4 que debe devolver la cadena de bits '0000100' usando tu código Obtengo '000100000' – David
Vaya, quiero decir que recibí '00100000' con tu código – David
Da primero bits bajos (lo cual es natural, ya que también da bytes bajos primero). Pero si quiere el otro orden, puede cambiar 'xrange (8)' a 'reverseed (xrange (8))'. –