Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

540
Views
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 answers
Answer question

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 Report

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!