2010-04-25 14 views
5

En algunos códigos en los que estoy trabajando debo ocuparme de diez parámetros independientes que pueden tomar uno de dos valores (0 o 1). Esto crea 2^10 condiciones distintas. Algunas de las condiciones nunca ocurren y pueden omitirse, pero las que sí ocurren son MUCHO y hacer un switch para manejar todos los casos es una locura.Computación y detección de bits de indicador

Quiero usar 10 if declaraciones en lugar de una enorme switch. Por esto, sé que debería usar los bits de marca, o más bien los bytes de marca, ya que el lenguaje es javascript y es más fácil trabajar con una cadena de 10 bytes para representar un binario de 10 bits.

Ahora, mi problema es que no sé cómo implementar esto. He visto esto usado en API s donde las opciones de selección múltiple están expuestas con los números 1, 2, 4, 8, ..., n^(n-1) que son equivalentes decimales de 1, 10, 100, 1000, etc. en binario Por lo tanto, si realizamos una llamada como bar = foo(7), la barra será un objeto con las opciones que permitan las tres marcas de la derecha.

Puedo convertir el número decimal en binario y en cada declaración if comprobar para ver si el dígito correspondiente está configurado o no. Pero me pregunto, ¿hay una manera de determinar el dígito n-th de un número decimal es cero o uno en forma binaria, sin realmente haciendo la conversión?

Respuesta

6

Simplemente use un bitwise-and. En C/C++, esto sería:

if (flags & 1) { 
    // Bit zero is set. 
} 
if (flags & 2) { 
    // Bit one is set. 
} 
if (flags & 4) { 
    // Bit two is set. 
} 
... 

Por la bondad de producción, utilizar nombres simbólicos para las máscaras de la bandera en lugar de los números mágicos, 1, 2, 4, 8, etc.

Si las banderas son homogéneas de alguna manera (por ejemplo, representan diez dimensiones espaciales en algún problema de geometría) y el código para manejar cada caso es lo mismo, se puede utilizar un bucle:

for (int f = 0; f < 10; ++f) { 
    if (flags & (1 << f)) { 
     // Bit f is set. 
    } 
} 
+0

WOW! ¡Muy rápido! Quería aceptar su respuesta de inmediato, pero aparentemente debería esperar al menos 9 minutos. Gracias de verdad. –

+0

+1 estaba escribiendo algo similar pero era más rápido;) –

1

usted podría conseguir un número que tiene la n-ésimo bit configurado y AND con tu número. Si el resultado es cero, su número no tiene el bit establecido. De lo contrario, lo hizo. Mire here, también.

2

Se puede utilizar un bit a bit y:

10 & 2^1 is true because 10 = 1010b 
           ^1 
8 & 2^1 is false because 8 = 1000b 
           ^0 
10 & 2^3 is true because 10 = 1010b 
          ^1 
Cuestiones relacionadas