Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

549
Vistas
forma eficiente de convertir un valor de 16 bits a un valor de 8 bits

Tengo una variable que tiene un valor de 16 bits. Necesito solo 8 LSB. Los 8 bits restantes deben descartarse.

Estoy usando este código para hacer esto.

 #include<stdio.h> #include<stdint.h> int main(int argc, char *argv[]) { int linkIndx,size=128; uint16_t val = 0xABCD; uint8_t vr; vr = val; //this assignment discards upper 8-bits printf("0x%X 0x%X ", val, vr); }

Resultado:

 0xABCD 0xCD

Quiero saber, ¿es una buena manera de tomar 8 LSB de una variable de 16 bits?

EDITAR:
Agregue problemas de rendimiento (desde la perspectiva de la memoria y la velocidad) con esta forma particular de implementación.

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Si bien ambas respuestas son correctas, el enmascaramiento de bits aquí es completamente redundante. Ocurre implícitamente al convertir a uint8_t . Sin tipos enteros de tamaño exacto (y, hablando de rendimiento, debe tenerlo en cuenta, porque el rendimiento en general es mejor cuando se usa el tamaño de palabra nativo de la máquina), esto sería diferente:

 unsigned int val = 0xabcd; unsigned int vr = val & 0xff; assert(vr == 0xcd);

Pero cuando realmente necesita tener estos tipos de tamaño exacto, el mejor código es en mi humilde opinión.

 uint16_t val = 0xabcd; uint8_t vr = (uint8_t) val;

¡El elenco explícito está aquí para documentar la intención! Sin él, un buen compilador le advertirá sobre la posible pérdida de información de la conversión implícita (y siempre debe habilitar las advertencias del compilador, por ejemplo, para gcc -Wall -Wextra -pedantic , para detectar casos en los que realiza dicha conversión por accidente ).

El rendimiento de todas las variantes que utilizan los tipos de tamaño exacto debería ser el mismo, porque un compilador decente emitirá el mismo código para todos ellos. La versión que usa solo unsigned int podría funcionar un poco mejor.

[editar] : como también pregunta sobre el rendimiento de la memoria : es poco probable que obtenga algo al usar uint8_t porque algunas arquitecturas requieren valores más pequeños que el tamaño de la palabra nativa para alinearse con los límites de la palabra. Si no lo requieren, aún podría ser más rápido alinearlos, por lo que el compilador podría decidir hacerlo. Eso solo introduce bytes de relleno no utilizados. Con gcc, puede usar la opción -Os para optimizar el tamaño y, dado que la arquitectura x86 es direccionable por bytes, esto puede resultar en que uint8_t se use sin relleno en una PC, pero en consecuencia con una velocidad más baja. La mayoría de las veces, la velocidad frente a la memoria es una compensación, puede tener uno u otro.

over 4 years ago · Santiago Trujillo Denunciar

0

Puedes hacer lo siguiente:

 uint16_t val = 0xABCD; uint8_t vr = val & 0x00FF; // Bitwise AND Operation

Usando esta operación bit a bit obtendrás 8 bits de LSB

over 4 years ago · Santiago Trujillo Denunciar

0

puede utilizar el concepto de enmascaramiento de bits.
Me gusta esto,

 uint16_t val = 0xABCD; uint8_t vr = (uint8_t) (val & 0x00FF);

O esto también se puede hacer simplemente con una conversión de tipos explícita, ya que un número entero de 8 bits solo transporta LBS 8 bits desde un valor de 16 bits, y descarta los restantes MSB 8 bits (de forma predeterminada, cuando asigna un valor mayor).

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda