c obtener el enésimo byte del entero

3 minutos de lectura

avatar de usuario
Kamran224

Sé que puedes obtener el primer byte usando

int x = number & ((1<<8)-1);

o

int x = number & 0xFF;

Pero no sé cómo obtener el enésimo byte de un número entero. Por ejemplo, 1234 es 00000000 00000000 00000100 11010010 como un entero de 32 bits. ¿Cómo puedo obtener todos esos bytes? el primero sería 210, el segundo sería 4 y los dos últimos serían 0.

  • Ya estás usando el operador de cambio de bits << en tu ejemplo ¿Cómo podrías usar el operador shift para obtener diferentes bits de tu número?

    – Greg Hewgill

    16/10/2011 a las 21:24


  • Pruebe con el otro operador de desplazamiento de bits.

    – Marcelo Cantos

    16/10/2011 a las 21:26

  • Tenga en cuenta que el “primer byte”, como lo usó aquí, puede no ser el primer byte en la memoria. Su ejemplo, 1234, puede muy fácilmente ser 11010010 en la dirección más baja, y, 00000000 en la dirección más alta.

    – Tánatos

    16/10/2011 a las 22:01

avatar de usuario
vaughn cato

int x = (number >> (8*n)) & 0xff;

donde n es 0 para el primer byte, 1 para el segundo byte, etc.

  • ¡Utilice paréntesis! Nunca puedo miembro si >> o * tiene mayor precedencia.

    – Greg Hewgill

    16/10/2011 a las 21:25


  • ¿Por qué esto no causa rarezas debido a un desplazamiento aritmético a la derecha? Sé que no, simplemente no entiendo por qué.

    – Brian Peterson

    11 de septiembre de 2019 a las 1:48

avatar de usuario
Dmitri

Para el (n+1)-ésimo byte en cualquier orden en que aparezca en la memoria (que también es de menor a mayor importancia en máquinas little-endian como x86):

int x = ((unsigned char *)(&number))[n];

Para el (n+1) byte de menos a más significativo en máquinas big-endian:

int x = ((unsigned char *)(&number))[sizeof(int) - 1 - n];

Para el (n+1) byte de menos a más significativo (cualquier endian):

int x = ((unsigned int)number >> (n << 3)) & 0xff;

Por supuesto, todos estos asumen que n < sizeof(int)y eso number es un int.

  • Si tenemos una matriz de int, ¿cómo cambiará la respuesta? Quiero decir, ¿cómo puedo obtener el valor del enésimo byte desde el comienzo de una matriz int?

    – Hosein Ghanbari

    24 de diciembre de 2017 a las 4:49

  • @HoseinGhanbari De la misma manera, pero encuentra el (n % sizeof(int))-ésimo byte del (n / sizeof(int))-ésimo elemento de la matriz.

    – Dmitri

    24 de diciembre de 2017 a las 6:36

int nth = (number >> (n * 8)) & 0xFF;

Llévelo al byte más bajo y tómelo de la manera “familiar”.

Si desea un byte, ¿no sería la mejor solución:

byte x = (byte)(number >> (8 * n));

De esta manera, está regresando y tratando con un byte en lugar de un int, por lo que estamos usando menos memoria y no tenemos que hacer la operación binaria y & 0xff solo para enmascarar el resultado hasta un byte. También vi que la persona que hizo la pregunta usó un int en su ejemplo, pero eso no lo hace correcto.

Sé que esta pregunta se hizo hace mucho tiempo, pero me encontré con este problema y creo que esta es una mejor solución de todos modos.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad