Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

550
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda