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?
Respuesta
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;
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. –
@ user239558 gracias por el ejemplo y la sintaxis adecuada. @ Paul R. ¿Diría simplemente mask AND value en el ejemplo proporcionado por user239558 –
@ Mr.Z: en C, C++ y en los idiomas relacionados, usted sería el operador ** de bit a bit, que se escribe como '&'. –
- 1. Comprender el filtro de Tcpdump y el enmascaramiento de bits
- 2. ¿Cómo lograr el enmascaramiento dinámico de UIView?
- 3. Enmascaramiento anidado de excepciones asincrónicas
- 4. Enmascaramiento de un CALayer - iPhone
- 5. .NET MVC enmascaramiento cuadros de texto Contraseña
- 6. Enmascaramiento alfa en C# System.Drawing?
- 7. Enmascaramiento de jQuery zip para varios formatos
- 8. Enmascaramiento CGContext con un CGPathRef?
- 9. Enmascaramiento de un CALayer con otro CALayer
- 10. uint es de 32 bits, sin importar si el sistema es de 32 o 64 bits?
- 11. ¿Por qué es útil contar la cantidad de bits?
- 12. Qué comando usar para comprobar si python es de 64 bits o de 32 bits
- 13. ¿Qué es un mapa de bits en C?
- 14. ¿Qué es int.MaxValue en una PC de 64 bits?
- 15. ¿Cuál es la diferencia entre Bitmap.Clone() y el nuevo mapa de bits (mapa de bits)?
- 16. Determine si el proceso actual de PowerShell es de 32 bits o de 64 bits.
- 17. ¿Qué es el tipo "int" compatible en las ventanas de 32 bits y 64 bits en C++?
- 18. enmascaramiento de una parte de un trazado contourf en matplotlib
- 19. ¿Es posible crear una imagen de transparencia transparente/capa de enmascaramiento utilizando canvas?
- 20. Reenvío de nombres de dominio con enmascaramiento Breaking Viewport
- 21. ¿iPhone OS es de 64 bits o 32 bits?
- 22. ¿Por qué debería usar el JDK de 64 bits en la versión de 32 bits?
- 23. ¿Qué dice el estándar C sobre el cambio de bits más bits que el ancho de tipo?
- 24. ¿Por qué BinaryReader.ReadUInt32() invierte el patrón de bits?
- 25. ¿Cuál es el número mínimo de bits necesarios para corregir todos los errores de 2 bits?
- 26. Comprobando si el archivo es de 32 bits o de 64 bits: en Windows
- 27. ¿Qué es un algoritmo eficiente en el tiempo para copiar matrices de bits no alineadas?
- 28. OleDB no es compatible con el modo de 64 bits?
- 29. Banderas de bits: ¿Qué me estoy perdiendo?
- 30. ¿Qué tan estable es el sshfs dokan?
¿Entiende operadores bit a bit como & |^etc y lógica booleana en general? Cualquier explicación de las operaciones de máscara requerirá esto. –
Sí, tengo un conocimiento de los operadores bit a bit, y la lógica booleana –
Sé que los enlaces no deben publicarse, pero la explicación de Wikipedia es genial: https://en.wikipedia.org/wiki/Mask_(computing) – pevik