operador left derecha corrimiento c# .net bit-manipulation

left - operador c#



Comprobando si un bit se establece o no (9)

¿Cómo comprobar si un bit determinado en un byte se establece?

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


Aquí está la solución en palabras.

Desplazar a la izquierda un entero con valor inicial 1 n veces y luego hacer un AND con el byte original. Si el resultado es distinto de cero, el bit se establece de lo contrario no. :)


Basándome en la respuesta de Mario Fernández , pensé, ¿por qué no tenerlo en mi caja de herramientas como un método de extensión útil no limitado al tipo de datos, por lo que espero que esté bien compartirlo 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; }


Desplace hacia la derecha su entrada n bits hacia abajo y enmascare con 1, luego pruebe si tiene 0 o 1.


Equivalente al código de Mario F, pero desplazando el byte en lugar de la máscara:

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


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]; }


Para verificar 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); }


Suena un poco como la tarea, pero:

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

pos 0 es el bit menos significativo, pos 7 es el más.


algo como

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


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;