2012-05-08 226 views
86

Soy bastante nuevo en la programación C, y encontré un poco de enmascaramiento. ¿Puede alguien explicarme el concepto general y la función del enmascaramiento de bits? Los ejemplos son muy apreciados.¿Qué es el enmascaramiento de bits?

+0

¿Entiende operadores bit a bit como & |^etc y lógica booleana en general? Cualquier explicación de las operaciones de máscara requerirá esto. –

+0

Sí, tengo un conocimiento de los operadores bit a bit, y la lógica booleana –

+1

Sé que los enlaces no deben publicarse, pero la explicación de Wikipedia es genial: https://en.wikipedia.org/wiki/Mask_(computing) – pevik

Respuesta

126

Una máscara define qué bits quiere conservar y qué bits quiere borrar.

El enmascaramiento es el acto de aplicar una máscara a un valor. Esto se logra haciendo:

  • Bitwise AND con el fin de extraer un subconjunto de los bits en el valor
  • Bitwise ORing el fin de establecer un subconjunto de los bits en el valor
  • Bitwise XORing con el fin para alternar un subconjunto de los bits en el valor

continuación se muestra un ejemplo de la extracción de un subconjunto de los bits en el valor:

Mask: 00001111b 
Value: 01010101b 

Aplicar la máscara al valor significa que queremos borrar los primeros 4 bits (más altos) y mantener los últimos 4 bits (más bajos). Por lo tanto, hemos extraído los 4 bits más bajos. El resultado es:

Mask: 00001111b 
Value: 01010101b 
Result: 00000101b 

enmascaramiento se implementa mediante Y, por lo que en C se obtiene:

uint8_t stuff(...) { 
    uint8_t mask = 0x0f; // 00001111b 
    uint8_t value = 0x55; // 01010101b 
    return mask & value; 
} 

Aquí es un caso de uso bastante común: La extracción de bytes individuales a partir de una palabra más larga. Definimos los bits de orden superior en la palabra como el primer byte. Utilizamos dos operadores para esto, & y >> (desplazamiento a la derecha). Esta es la forma en que podemos extraer los cuatro bytes de un entero de 32 bits:

void more_stuff(uint32_t value) {    // Example value: 0x01020304 
    uint32_t byte1 = (value >> 24);   // 0x01020304 >> 24 is 0x01 so 
               // no masking is necessary 
    uint32_t byte2 = (value >> 16) & 0xff; // 0x01020304 >> 16 is 0x0102 so 
               // we must mask to get 0x02 
    uint32_t byte3 = (value >> 8) & 0xff; // 0x01020304 >> 8 is 0x010203 so 
               // we must mask to get 0x03 
    uint32_t byte4 = value & 0xff;   // here we only mask, no shifting 
               // is necessary 
    ... 
} 

Tenga en cuenta que usted podría cambiar el orden de los operadores anterior, se puede hacer primero la máscara, entonces el cambio. Los resultados son los mismos, pero ahora tendría que usar una máscara diferente:

uint32_t byte3 = (value & 0xff00) >> 8; 
+0

Buena respuesta, pero el enmascaramiento puede también se puede aplicar para ajustar * o * alternar * bits específicos con operaciones OR o XOR y una máscara adecuada. –

+0

@ user239558 gracias por el ejemplo y la sintaxis adecuada. @ Paul R. ¿Diría simplemente mask AND value en el ejemplo proporcionado por user239558 –

+0

@ Mr.Z: en C, C++ y en los idiomas relacionados, usted sería el operador ** de bit a bit, que se escribe como '&'. –

Cuestiones relacionadas