2010-11-16 18 views
7

Estoy intentando obtener más información sobre esto para implementar en mi proyecto.Operadores booleanos simples para indicadores de bit

Yo actualmente tengo este básicamente:

unsigned char flags = 0; //8 bits 

flags |= 0x2; //apply random flag 

if(flags & 0x2) { 
    printf("Opt 2 set"); 
} 

Ahora estoy deseando hacer cosas un poco más complejas, lo que estoy queriendo hacer es aplicar tres banderas como esto:

flags = (0x1 | 0x2 | 0x4); 

Y luego eliminar los indicadores 0x1 y 0x2 de él? Pensé que podría hacer algo como esto a nivel de bits aplicando NO (AND bit a bit y aplicarlo):

flags &= ~(0x1 | 0x2); 

Al parecer, permanecen allí o algo de cualquier manera cuando compruebo.

Tampoco sé cómo comprobar si NO existen en los indicadores de bits (por lo que no puedo verificar si mi código anterior funciona), ¿sería algo como esto?

if(flags & ~0x2) 
    printf("flag 2 not set"); 

No puedo encontrar ningún recurso de mis búsquedas recientes que se aplican a esto, estoy dispuesto a aprender esto para enseñar a otros, estoy realmente interesado. Me disculpo si esto es confuso o simple.

Respuesta

21

¿Y quitan dos de él? Pensé que podía hacer algo como esto:

flags &= ~(0x1 | 0x2); 

para eliminar esas dos banderas, pero aparentemente permanecen allí o algo de cualquier manera.

Esa es la manera correcta de eliminar banderas. Si printf("%d\n", flags) después de esa línea, la salida debe ser 4.

Asimismo, no sé cómo comprobar si que no existen en el indicador de bits (por lo no puedo comprobar si mi código anterior obras), sería algo así como esto?

if(flags & ~0x2) 
    printf("flag 2 not set"); 

Nop:

if ((flags & 0x2) == 0) 
    printf("flag 2 not set"); 

EDIT:

para la prueba de la presencia de múltiples banderas:

if ((flags & (0x1 | 0x2)) == (0x1 | 0x2)) 
    printf("flags 1 and 2 are set\n"); 

para probar la ausencia de múltiples banderas , simplemente compare con 0 como antes:

if ((flags & (0x1 | 0x2)) == 0) 
    printf("flags 1 and 2 are not set (but maybe only one of them is!)\n"); 
+0

yo estaba bien la primera vez, gracias! – John

+0

Claro, no hay problema. Los operadores bit a bit son divertidos. :) – cdhowie

+0

¿Ahora cómo verificaría si dos banderas se establecieron sin booleano y? como 'if (flags & (0x1 | 0x2))' pero parece funcionar incluso si solo configuré '0x1' .. – John

11

No estoy seguro de por qué piensas que la operación de borrado no funcionará.

flags &= ~(0x1 | 0x2); 

es la forma correcta de hacerlo.La operación para comprobar si un poco no es conjunto es:

if (!(flags & 0x2)) ... 

la que tiene:

if (flags & ~0x2) ... 

será verdadera si se ha establecido ningún otro bit, que es probablemente la razón por lo que la operación de limpieza no está funcionando. El problema no radica en el despeje sino en el control.

Si desea comprobar que todos los bits en un grupo se establecen:

if ((flags & (0x2|0x1)) == 0x2|0x1) ... 
Cuestiones relacionadas