c++ c++11 bitmask

c++ - Cómo usar bitmask?



c++11 (4)

Brevemente, la máscara de bits ayuda a manipular la posición de valores múltiples. Hay un buen ejemplo aquí;

Bitflags es un método para almacenar múltiples valores, que no son mutuamente exclusivos, en una variable. Probablemente los has visto antes. Cada indicador es una posición de bit que se puede activar o desactivar. A continuación, tiene un conjunto de máscaras de bits definidas para cada posición de bit para que pueda manipularlo fácilmente:

#define LOG_ERRORS 1 // 2^0, bit 0 #define LOG_WARNINGS 2 // 2^1, bit 1 #define LOG_NOTICES 4 // 2^2, bit 2 #define LOG_INCOMING 8 // 2^3, bit 3 #define LOG_OUTGOING 16 // 2^4, bit 4 #define LOG_LOOPBACK 32 // and so on... // Only 6 flags/bits used, so a char is fine unsigned char flags; // initialising the flags // note that assignming a value will clobber any other flags, so you // should generally only use the = operator when initialising vars. flags = LOG_ERRORS; // sets to 1 i.e. bit 0 //initialising to multiple values with OR (|) flags = LOG_ERRORS | LOG_WARNINGS | LOG_INCOMING; // sets to 1 + 2 + 8 i.e. bits 0, 1 and 3 // setting one flag on, leaving the rest untouched // OR bitmask with the current value flags |= LOG_INCOMING; // testing for a flag // AND with the bitmask before testing with == if ((flags & LOG_WARNINGS) == LOG_WARNINGS) ... // testing for multiple flags // as above, OR the bitmasks if ((flags & (LOG_INCOMING | LOG_OUTGOING)) == (LOG_INCOMING | LOG_OUTGOING)) ... // removing a flag, leaving the rest untouched // AND with the inverse (NOT) of the bitmask flags &= ~LOG_OUTGOING; // toggling a flag, leaving the rest untouched flags ^= LOG_LOOPBACK; **

ADVERTENCIA: NO use el operador de igualdad (es decir, bitflags == bitmask) para probar si se establece un indicador; esa expresión solo será verdadera si ese indicador está establecido y todos los demás están desactivados. Para probar un solo indicador, debe usar & y ==:

**

if (flags == LOG_WARNINGS) //DON''T DO THIS ... if ((flags & LOG_WARNINGS) == LOG_WARNINGS) // The right way ... if ((flags & (LOG_INCOMING | LOG_OUTGOING)) // Test for multiple flags set == (LOG_INCOMING | LOG_OUTGOING)) ...

También puedes buscar C ++ Triks

¿Cómo lo uso en C ++? ¿Cuándo es útil usar?
Por favor dame un ejemplo de un problema donde se usa máscara de bits, cómo funciona en realidad. ¡Gracias!


Digamos que tengo un valor ARGB de 32 bits con 8 bits por canal. Quiero reemplazar el componente alfa con otro valor alfa, como 0x45

unsigned long alpha = 0x45 unsigned long pixel = 0x12345678; pixel = ((pixel & 0x00FFFFFF) | (alpha << 24));

La máscara convierte los 8 bits superiores en 0, donde estaba el antiguo valor alfa. El valor alfa se desplaza hasta las últimas posiciones de bit que tomará, luego se OR-ed en el valor de píxel enmascarado. El resultado final es 0x45345678 que se almacena en píxeles.


El enmascaramiento de bits es "útil" para usar cuando desee almacenar (y posteriormente extraer) datos diferentes dentro de un solo valor de datos.

Una aplicación de ejemplo que he usado anteriormente es imaginar que estaba almacenando valores RGB de color en un valor de 16 bits. Entonces algo que se ve así:

RRRR RGGG GGGB BBBB

A continuación, puede usar el enmascaramiento de bits para recuperar los componentes de color de la siguiente manera:

const unsigned short redMask = 0xF800; const unsigned short greenMask = 0x07E0; const unsigned short blueMask = 0x001F; unsigned short lightGray = 0x7BEF; unsigned short redComponent = (lightGray & redMask) >> 11; unsigned short greenComponent = (lightGray & greenMask) >> 5; unsigned short blueComponent = (lightGray & blueMask);


Las máscaras de bits se usan cuando desea codificar varias capas de información en un solo número.

Entonces (suponiendo permisos de archivos de Unix) si desea almacenar 3 niveles de restricción de acceso (lectura, escritura, ejecución), puede verificar cada nivel marcando el bit correspondiente.

rwx --- 110

110 en la base 2 se traduce a 6 en la base 10.

Por lo tanto, puede verificar fácilmente si alguien tiene permiso, por ejemplo, para leer el archivo al ingresar el campo de permiso con el permiso deseado.

Pseudocódigo:

PERM_READ = 4 PERM_WRITE = 2 PERM_EXEC = 1 user_permissions = 6 if (user_permissions & PERM_READ == TRUE) then // this will be reached, as 6 & 4 is true fi

Se necesita una comprensión práctica de la representación binaria de números y operadores lógicos para comprender los campos de bits.