2010-04-25 15 views
5

In alcuni codici su cui sto lavorando dovrei occuparmi di dieci parametri indipendenti che possono assumere uno dei due valori (0 o 1). Questo crea 2^10 condizioni distinte. Alcune delle condizioni non si verificano mai e possono essere omesse, ma quelle che si verificano sono ancora MOLTO e fare un switch per gestire tutti i casi è folle.Calcolo del bit di flag e rilevamento

Desidero utilizzare 10 dichiarazioni if anziché un enorme switch. Per questo so che dovrei usare i bit di flag, o meglio i flag di flag in quanto la lingua è javascript ed è più facile lavorare con una stringa da 10 byte con per rappresentare un binario a 10 bit.

Ora, il mio problema è che non so come implementarlo. Ho visto questo usato in API s dove le opzioni selezionabili più sono esposte con i numeri 1, 2, 4, 8, ..., n^(n-1) che sono equivalenti decimali di 1, 10, 100, 1000, ecc . in binario. Quindi, se facciamo chiamate come bar = foo(7), la barra sarà un oggetto con qualsiasi opzione abilitata dai tre flag all'estrema destra.

Posso convertire il numero decimale in binario e in ogni controllo dell'istruzione if per verificare se la cifra corrispondente è impostata o meno. Ma mi chiedo, c'è un modo per determinare la n-th cifra di un numero decimale è pari a zero o uno in forma binaria, senza effettivamente facendo la conversione?

risposta

6

basta usare un bit a bit-e. In C/C++, questo sarebbe:

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

per la bontà di produzione, utilizzare nomi simbolici per le maschere di bandiera al posto dei numeri magici, 1, 2, 4, 8, ecc

Se le bandiere sono omogenea in qualche modo (per esempio, rappresentano dieci dimensioni spaziali in qualche problema di geometria) e il codice per gestire ogni caso è lo stesso, è possibile utilizzare un ciclo:

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

WOW! Molto veloce! Volevo accettare subito la tua risposta, ma a quanto pare dovrei aspettare almeno 9 minuti. Grazie davvero. –

+0

+1 stava scrivendo qualcosa di simile ma tu eri più veloce;) –

1

si potrebbe ottenere un numero che ha la n-esimo bit impostato e AND con il tuo numero. Se il risultato è zero, il tuo numero non ha il bit impostato. Altrimenti, lo ha fatto. Guarda anche here.

2

È possibile utilizzare un bit a bit e:

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