Qué es una máscara de bits
Una máscara de bits es un número que se usa por su patrón de bits y no por su valor. Cada posición de bit representa una opción de encendido/apagado, de modo que un solo entero puede contener 8, 32 o 64 banderas a la vez. Los permisos (rwx), los modos de apertura de archivos, los bits de características de la CPU, las máscaras de red y los conjuntos de opciones de casi cualquier API en C son máscaras de bits.
El bit n vale 2ⁿ, así que una máscara con los bits 0, 2 y 7 activos es 1 + 4 + 128 = 133 = 0x85 = 1000 0101. La constante en el código se construye desplazando un 1 a la posición: 1 << 7.
Usar una máscara
| Objetivo | Cómo |
|---|---|
| Comprobar si una bandera está activa | (value & FLAG) != 0 |
| Comprobar si varias banderas están todas activas | (value & MASK) == MASK |
| Activar una bandera | value |= FLAG |
| Borrar una bandera | value &= ~FLAG |
| Alternar una bandera | value ^= FLAG |
| Extraer un campo de los bits 4–7 | (value >> 4) & 0xF |
| Construir una máscara para los bits lo..hi | ((1 << (hi - lo + 1)) - 1) << lo |
Leer una máscara dada
Convierte el valor a binario y numera los bits desde la derecha empezando en 0. Cada 1 es una bandera activa. La herramienta de arriba lo hace para cualquier valor que pegues y muestra las posiciones como una lista compacta, por ejemplo 0-2, 5, 7.
Ejemplos
Preguntas
¿Por qué las posiciones de bits empiezan en 0?
Porque el bit n vale 2ⁿ y 2⁰ = 1 es el bit más a la derecha. Contar desde 0 hace que la aritmética cuadre: desplazar n posiciones pone un 1 en el bit n.
¿Cuál es la diferencia entre una máscara de bits y un campo de bits?
Una máscara de bits es el número con el que haces AND u OR. Un campo de bits es un grupo de bits adyacentes dentro de un valor mayor que juntos guardan un número pequeño (por ejemplo, los bits 4–7 con un valor de 0 a 15). Para leer o escribir un campo de bits se usa una máscara y un desplazamiento.
¿Cuántas banderas caben en un entero?
Una por bit: 8 en un byte, 32 en un int de 32 bits, 64 en uno de 64. Si necesitas más, usa un array de enteros o un tipo bitset propio.
¿Por qué 1 << n en vez del número directamente?
Documenta qué bit se quiere decir y no se puede teclear mal como otra potencia de dos. Los compiladores lo pliegan a una constante, así que no cuesta nada en tiempo de ejecución.
¿La herramienta maneja máscaras de 64 bits correctamente?
Sí. Calcula con enteros de precisión arbitraria, así que los 64 bits son exactos, incluido el bit 63.