En varios sistemas de comunicaciones digitales los datos viajan de manera serial (es decir, uno tras otro), y en bloques de una cantidad fija de bits (valores 0 o 1). La transmisión física de los datos no conoce de esta separación por bloques, y por lo tanto es necesario que haya programas que separen y organicen los datos recibidos.
Los datos transmitidos los representaremos como arreglos cuyos valores son ceros y unos.
Una secuencia de bits puede interpretarse como un número decimal. Cada bit está asociado a una potencia de dos, partiendo desde el último bit. Por ejemplo, la secuencia 01001 representa al número decimal 9, ya que:
Escriba la función numero_decimal(datos) que entregue la representación decimal de un arreglo de datos:
>>> a = array([0, 1, 0, 0, 1])
>>> numero_decimal(a)
9
Suponga que el tamaño de los bloques es de cuatro bits. Escriba la función bloque_valido(datos) que verifique que la corriente de datos tiene una cantidad entera de bloques:
>>> bloque_valido(array([0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0]))
True
>>> bloque_valido(array([0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1]))
False
Escriba la función decodificar_bloques(datos) que entregue un arreglo con la representación entera de cada bloque. Si un bloque está incompleto, esto debe ser indicado con el valor -1:
>>> a = array([0, 1, 0, 1])
>>> b = array([0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0])
>>> c = array([0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1])
>>> decodificar_bloques(a)
array([5])
>>> decodificar_bloques(b)
array([5, 7, 2])
>>> decodificar_bloques(c)
array([5, 7, 2, -1])