2011-10-16 15 views
27

So che si può ottenere il primo byte utilizzandoC get byte ennesima di integer

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

o

int x = number & 0xFF; 

Ma non so come ottenere il byte n-esima di un numero intero. Ad esempio, 1234 è 00000000 00000000 00000100 11010010 come numero intero a 32 bit Come posso ottenere tutti questi byte? primo sarebbe 210, secondo sarebbe 4 e gli ultimi due sarebbe 0.

+1

Si sta già utilizzando l'operatore di spostamento dei bit '<<' nel proprio esempio. Come puoi usare l'operatore del cambio per ottenere diversi bit dal tuo numero? –

+0

Prova l'altro operatore di spostamento del bit. –

+1

Ricorda che il "primo byte", come lo hai usato qui, potrebbe non essere il primo byte in memoria. Il tuo esempio, 1234, potrebbe facilmente essere '11010010' nell'indirizzo più basso e, '00000000' nell'indirizzo più alto. – Thanatos

risposta

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

dove n è 0 per il primo byte, 1 per il secondo byte, ecc

+12

Si prega di utilizzare parentesi! Non posso mai far parte se '>>' o '*' ha precedenza più alta. –

2

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

Trasportalo nel byte più basso e prendilo nel modo "familiare".

12

Per la (n + 1) esimo byte in qualsiasi ordine in cui appaiono nella memoria (che è ai minimi anche più- significativo sulle macchine little-endian come x86):

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

Per la (n +1) -esimo byte dal meno al più significativo sulle macchine big-endian:

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

per la (n + 1) -esimo byte dal meno al più significativo (qualsiasi endian):

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

Naturalmente, tutti questi presuppongono che n < sizeof(int) e che number sia un int.

+0

Se abbiamo una matrice di int, come cambierà la risposta? Voglio dire, come posso ottenere il valore dell'nth-byte dall'inizio di un array int? – HoseinGhanbari

+0

@HoseinGhanbari Stesso modo, ma trova il byte '(n% sizeof (int))' -th dell'elemento '' n/sizeof (int)) '-th. – Dmitri