Saltar al contenido

Dividir un int de 16 bits en dos entradas de 8 bits en Python

Solución:

yo lo haría

c = (x >> 8) & 0xff
f = x & 0xff

Es más seguro, ver p. Ej.

>>> (10303 >> 8) & 0xff
40
>>> (1030333333 >> 8) & 0xff
163
>>> (1030333333 >> 8) 
4024739

Ya que en Python no puedes control si el número es de 16 bits o no, debe forzarlo a un valor de 16 bits como máximo. Esto no es necesario si está seguro de tener un valor de 16 bits, pero de esta manera la función es más general y le permite estar interesado solo en valores de 16 bits, sin importar lo que contenga el contenedor.

En Python, la manipulación de bits no tiene ninguna ventaja en particular, por lo que iría con:

c, f= divmod(your_number, 256)

EDITAR: Para que su intención sea aún más obvia para el visor de fuentes con poderes de dos desafiados (si existe tal bestia), puede reemplazar el simple 256 con alternativas mucho más coloridas, como 1<<8, 2**8, 0x100 o 0400 (es decir 0o400 para Python 3). El plegado constante realizado por el optimizador de mirilla desde Python 2.5 asegura que cualquiera de ellos sea exactamente igual que usar 256 (Obviamente estoy hablando de las dos primeras alternativas, que son expresiones que evalúan a 256; los dos últimos están el constante 256).

$ python
Python 2.6.4 (r264:75706, Dec  7 2009, 18:45:15)
[GCC 4.4.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import dis
>>> dis.dis(compile("c, f= divmod(your_number, 1<<8)", "", "exec"))
  1           0 LOAD_NAME                0 (divmod)
              3 LOAD_NAME                1 (your_number)
              6 LOAD_CONST               3 (256)
              9 CALL_FUNCTION            2
             12 UNPACK_SEQUENCE          2
             15 STORE_NAME               2 (c)
             18 STORE_NAME               3 (f)
             21 LOAD_CONST               2 (None)
             24 RETURN_VALUE

Debe ser consistente, si la intención de las operaciones es aritmética, use módulo y división, si es solo para manipulación de bits sin procesar, use shift y mask.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *