2011-10-16 30 views
27

Sé que usted puede conseguir el primer byte mediante el uso deC Trae enésimo byte de número entero

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

o

int x = number & 0xFF; 

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

+1

Ya está utilizando el operador de desplazamiento de bits '<<' en su ejemplo. ¿Cómo podría usar el operador de desplazamiento para obtener diferentes bits de su número? –

+0

Pruebe con el otro operador de cambio de bit. –

+1

Tenga en cuenta que el "primer byte", como lo ha usado aquí, puede no ser el primer byte en la memoria. Su ejemplo, 1234, puede ser fácilmente '11010010' en la dirección más baja, y' 00000000' en la dirección más alta. – Thanatos

Respuesta

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

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

+12

¡Utilice paréntesis! Nunca puedo decir si '>>' o '*' tiene mayor precedencia. –

2

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

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

12

Para el (n + 1) de bytes en el orden en que aparecen en la memoria (que también se menos- de nación más significativa en las máquinas little-endian como x86):

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

Para el (n 1) ésimo byte de menos a más significativa en máquinas big-endian:

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

para la (n + 1) ésimo byte de menos a más significativa (cualquier endian):

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

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

+0

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

+0

@HoseinGhanbari Del mismo modo, pero encuentre el byte '(n% sizeof (int))' -th del elemento de matriz '(n/sizeof (int))' -th. – Dmitri