2010-03-12 17 views
48

¿Cómo comprobar si se ha establecido un cierto bit en un byte?Comprobando si un bit está configurado o no

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

Su último bit de texto no tiene ningún sentido. – leppie

+9

Parece un problema de tarea, pero piensa en cuánta gente se beneficia con este código de snipset. – Manjoor

+1

Estoy usando esto en mi trabajo. La lucha es real. – cambunctious

Respuesta

116

suena un poco como tarea, pero:

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

pos 0 es el bit menos significativo, pos 7 es mayor.

+32

otro one-liner siempre busco en Google en lugar de solo aprenderlo :) – grapkulec

5

Aquí está la solución en palabras.

Desplaza a la izquierda un número entero con valor inicial 1 n veces y luego haz una AND con el byte original. Si el resultado es distinto de cero, el bit se establece de otro modo no. :)

+0

Ok. Byte de 3, prueba si el bit 1 está configurado. Entonces 1 << 1 es 2. 2 & 3 no es verdadero. Fallar. – spender

+1

@spender: err, seguramente 2 y 3 son 2 (en binario 10 y 11 = 10) que no es cero y, por lo tanto, es un resultado verdadero. OK, C# no te permite hacer eso como C/C++, así que necesitarías una prueba de! = 0. – Skizz

+0

¿Quizás el cheque debería ser distinto de cero? afaik, no cero no es verdadero. – spender

3

desplazamiento a la derecha de su entrada de n bits hacia abajo y máscara con 1, a continuación, comprobar si usted tiene 0 o 1.

+0

Prefiero esta forma también, el cambio a la izquierda parece tan antinatural :) – leppie

0

algo así como

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

Esto también funciona (probado en .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

Si juegas un poco, probablemente estés después de la actuación. Hacerlo de esta manera puede parecer más OO, pero va a matar el perf. –

+0

No te rechazaré ni nada por el estilo, pero si buscas rendimiento, entonces no deberías hacer esto. – Gaspa79

0

Para comprobar los bits en una palabra de 16 bits:

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

Generalmente es una buena práctica sobre SO explicar su solución, más el porqué que el cómo. – ForceMagic

+0

OMG, dejemos de lado la pregunta de si el compilador precalculó todos esos Math.Pow por usted, pero ¿por qué no hacer ((x & Math.Pow)! = 0) en su lugar? Está más claro y podría ahorrar algunos nanosegundos también. – Konstantin

10

Basado en Mario Fernandez's answer, pensé ¿por qué no lo tiene en mi caja de herramientas como un método de extensión útil no limitado a tipo de datos, por lo que espero que está bien que tú aquí:

/// <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 al código de Mario F , pero cambiando el byte en lugar de la máscara:

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