2010-03-12 8 views
48

Come verificare se è impostato un determinato bit in un byte?Controllare se un bit è impostato o meno

bool IsBitSet(Byte b,byte nPos) 
{ 
    return .....; 
} 
+0

L'ultimo pezzetto di testo non ha alcun senso. – leppie

+9

Sembra un problema da fare a casa, ma pensa a quante persone ottengono il beneficio da questo codice snipset .. – Manjoor

+1

Sto usando questo al mio lavoro. La lotta è reale. – cambunctious

risposta

116

suona un po 'come compiti a casa, ma:

bool IsBitSet(byte b, int pos) 
{ 
    return (b & (1 << pos)) != 0; 
} 

pos 0 è bit meno significativo, pos 7 è più.

+32

ancora un altro liner cerco sempre google invece di impararlo :) – grapkulec

5

Ecco la soluzione a parole.

Spostare a sinistra un numero intero con valore iniziale 1 n volte, quindi eseguire un AND con il byte originale. Se il risultato è diverso da zero, il bit è impostato altrimenti no. :)

+0

Ok. Byte di 3, testare se il bit 1 è impostato. Quindi 1 << 1 è 2. 2 e 3 non è vero. Fallire. – spender

+1

@spender: err, sicuramente 2 e 3 è 2 (in binario 10 e 11 = 10) che è diverso da zero e quindi un risultato vero. OK, C# non ti permette di fare ciò come C/C++, quindi avresti bisogno di un test! = 0. – Skizz

+0

Forse il controllo dovrebbe essere diverso da zero? afaik, non-zero non è vero. – spender

3

spostamento a destra il vostro input n bit verso il basso e maschera con 1, quindi verificare se si dispone di 0 o 1.

+0

Preferisco anche questo modo, lo spostamento a sinistra sembra solo così innaturale :) – leppie

0

qualcosa come

return ((0x1 << nPos) & b) != 0 
5

Questo funziona anche (testato in .NET 4):

void Main() 
{ 
    //0x05 = 101b 
    Console.WriteLine(IsBitSet(0x05, 0)); //True 
    Console.WriteLine(IsBitSet(0x05, 1)); //False 
    Console.WriteLine(IsBitSet(0x05, 2)); //True 
} 

bool IsBitSet(byte b, byte nPos){ 
    return new BitArray(new[]{b})[nPos]; 
} 
+5

Se sei un po 'giocherellona, ​​sei probabilmente dopo la performance. Facendolo in questo modo puoi sentire più OO, ma ucciderà il perf. –

+0

Non ho intenzione di minimizzare te o altro, ma se stai cercando prestazioni non dovresti farlo. – Gaspa79

0

Per controllare i bit in una parola di 16 bit:

Int16 WordVal = 16; 
    for (int i = 0; i < 15; i++) 
    { 
    bitVal = (short) ((WordVal >> i) & 0x1); 
    sL = String.Format("Bit #{0:d} = {1:d}", i, bitVal); 
    Console.WriteLine(sL); 
    } 
2
x == (x | Math.Pow(2, y)); 

int x = 5; 

x == (x | Math.Pow(2, 0) //Bit 0 is ON; 
x == (x | Math.Pow(2, 1) //Bit 1 is OFF; 
x == (x | Math.Pow(2, 2) //Bit 2 is ON; 
+1

Di solito è una buona pratica su SO spiegare la propria soluzione, più il perché che il come. – ForceMagic

+0

OMG, mettiamo da parte la domanda se il compilatore precalcoli tutti quei Math.Pow per te, ma perché non fai il ((x & Math.Pow)! = 0) invece? È più chiaro e potrebbe risparmiare anche alcuni nanosecondi. – Konstantin

10

Sulla base di Mario Fernandez's answer, ho pensato perché non ha nella mia cassetta degli attrezzi come un metodo di estensione a portata di mano non solo, tipo di dati, quindi spero che sia OK per condividerle qui:

/// <summary> 
/// Returns whether the bit at the specified position is set. 
/// </summary> 
/// <typeparam name="T">Any integer type.</typeparam> 
/// <param name="t">The value to check.</param> 
/// <param name="pos"> 
/// The position of the bit to check, 0 refers to the least significant bit. 
/// </param> 
/// <returns>true if the specified bit is on, otherwise false.</returns> 
public static bool IsBitSet<T>(this T t, int pos) where T : struct, IConvertible 
{ 
var value = t.ToInt64(CultureInfo.CurrentCulture); 
return (value & (1 << pos)) != 0; 
} 
0

Equivalente a codice Mario F , ma spostando il byte invece della maschera:

bool IsBitSet(byte b, int pos) 
{ 
    return ((b >> pos) & 1) != 0; 
}