2011-10-19 23 views
12

Esiste un metodo in genere utilizzato per verificare se un flag è presente in un tipo di dati int/other? Ho capito qualcosa di simile:bitwise controllare se flag flag

if ((host&flagtocheckfor)==flagtocheckfor) 

Quali opere Fine- tuttavia è un metodo così comune di impostare flag è questo il modo in cui le bandiere di solito sono controllati? O c'è un metodo più conciso?

+2

È non è necessario il flag == flagtocheckfor. Il risultato di & è 0 (il bit era disattivato) o il non 0 (il bit era attivo) e almeno in C, che corrisponde già a False e True. – librik

+1

@librik, va bene per le maschere single-bit, ma alcune possono essere multibit. Vedi la mia risposta. – paxdiablo

risposta

23

Questo è abbastanza buono esattamente il modo in cui i bit flag vengono controllati nella maggior parte delle lingue che li supportano.

Ad esempio:

#define BIT_7 0x80 
#define BITS_0_AND_1 0x03 

if ((flag & BIT_7) == BIT_7) ... 
if ((flag & BITS_0_AND_1) == BITS_0_AND_1) ... 

Mentre è possibile controllare qualcosa come il primo con:

if ((flag & BIT_7) != 0) ... 

che non effettivamente lavorare per il secondo dato che restituisce true se uno di i bit sono impostati, non entrambi.

Per completezza, C consente di impostare le maschere di bit con:

flag = flag | BIT_7; // or you can also use 'flag |= BIT_7' 

Si possono cancellare con:

flag = flag & (~BIT_7); 

e tumbler loro:

flag = flag^BIT_7; 
+0

Aha- beh, grazie, non ero sicuro. – ultifinitus