Extraer bits

Extraer bits

de Alejandro Barreiro Deminco -
Número de respuestas: 3
Hola, una consulta, si yo tengo 2 bytes y quiero extraer el byte alto (mas significativo) y el byte bajo
¿Esta bien hacer:
byte_alto = 2bytes & 0xFF00 
byte_bajo = 2bytes & 0x00FF  ?

Me gustaría saber como es la otra forma usando modulo y división
saludos

En respuesta a Alejandro Barreiro Deminco

Re: Extrar bits

de Federico Rivero -
Alejandro:

Asumiendo que byte_alto y byte_bajo son variables de tipo char o byte, en ambos casos se estaría haciendo un casteo implícito de 2 bytes a un byte. En el caso del a segunda asignación, eso no te causaría problemas ya que en 'byte_bajo' se guardaría el byte menos significativo de la operación, que es efectivamente el que querés, pero en caso de la primer asignación, a byte_alto se le va a asignar el byte menos significativo de la operación, que es 0.

Las asignaciones correctas serían:

byte_alto = (2bytes >> 8) & 0x00FF // Corro los bits más significativos a la derecha para obtenerlos
byte_bajo = 2bytes & 0x00FF

Con módulo y división es muy similar, ya que 'shiftear' un lugar a la derecha en binario equivale a la división entera entre 2.

byte_alto = (2 bytes / 256) % 256;
byte_bajo = 2bytes % 256;

En respuesta a Federico Rivero

Re: Extrar bits

de Marcelo Daniel Lopez Lopez -

Federico, una consulta... no me queda claro porque para byte_alto lo debemos 'shiftear' y luego aplicarle el and. No entiendo porque se debe hacer el shifteo? 


Por otro lado, seria lo mismo hacer

byte_alto = (2bytes >> 8) & 0x00FF

que hacer 

byte_alto = (2bytes  & 0x00FF) >> 8


en los exámenes los he visto de ambas maneras por eso es que se me genera la duda. 


Gracias!

En respuesta a Marcelo Daniel Lopez Lopez

Re: Extrar bits

de Federico Rivero -
Marcelo:

El tema es el tamaño de las variables. Supuse (por el nombre) que byte_alto es una variable de 8 bits. La operación '2bytes & 0xFF00', da como resultado 2 bytes, donde el primero es el byte alto de la variable '2bytes' y el segundo es 0. Si se le asignan esos 16 bits a una variable de 8 bits, se trunca el valor de la variable de 16 bits, asignando los 8 bits menos significativos.

Con respecto a tu segunda pregunta, no es lo mismo. El segundo caso devuelve el resultado incorrecto, ya que se setean los 8 bits más significativos en 0, y luego se corren, asignando a la variable 'byte_alto' el valor cero.

Un detalle más, en el primer caso, el and binario es irrelevante. Es decir, esto:

byte_alto = 2bytes >> 8

Ya devuelve el valor correcto :).

Saludos,
Federico