2011-08-09 17 views
10

Tengo algo de código heredado y no se puede averiguar una sola pieza de la misma:necesita ayuda para entender el uso de los operadores de bits

byte[] b = new byte[4] { 3, 2, 5, 7 }; 
int c = (b[0] & 0x7f) << 24 | b[1] << 16 | b[2] << 8 | b[3]; 

Puede alguien decir qué está pasando aquí? ¡Gracias!

+0

Quiere darnos un poco de contexto acerca de dónde has encontrado este código? ¿O es solo una prueba? – Nix

+0

@Nix es donde lo consiguió realmente relevante? – MGZero

+0

@MGZero ahora que se ha respondido no ... – Nix

Respuesta

20

Básicamente convierte los 31 bits inferiores de una matriz de 4 bytes en un número entero usando big-endian conversion.

Entonces una matriz de bytes de {0, 0, 0, 1} se convertiría a 1; una matriz de bytes de {0, 0, 1, 0} se convertiría a 256 etc.

Lo hace a través de una mezcla de operadores de bits:

+0

¿Alguna información detallada sobre esto? Enlaces, etc. Apreciaría eso. – Kizz

+0

@Kizz: solo estaba editando con enlaces para cada operador. Que más necesitas? –

+0

@Jon: ¡Gracias! – MTG

5

no lo han hecho poco matemáticas en un minuto so..for diversión:
[paréntesis adicionales para mostrar el orden de operaciones]

((b[0] & 0x7f) << 24) | (b[1] << 16) | (b[2] << 8) | b[3] 

(b[0] & 0x7f) << 24 = 11 0000 0000 0000 0000 0000 0000 
b[1] << 16 = . . . . . . . . . . 10 0000 0000 0000 0000 
b[2] << 8 = . . . . . . . . . . . . . . . 101 0000 0000 
b[3] = . . . . . . . . . . . . . . . 0111 

ahora O estos juntos, y se obtiene

0011 0000 0010 0000 0101 0000 0111 = 50,464,007 
Cuestiones relacionadas