Cómo verificar si un bit en particular está configurado en C #

En C #, tengo un valor de 32 bits que estoy almacenando en un int. Necesito ver si se establece un bit en particular. Lo que necesito es 0x00010000.

Se me ocurrió esta solución:

Esto es lo que estoy buscando:

Hex: 0 0 0 1 0 0 0 0 0 Binario 0000 | 0000 | 0000 | 0001 | 0000 | 0000 | 0000 | 0000 | 0000

Así que hice el cambio de bit a la derecha 16, lo que me daría:

Hex: 0 0 0 0 0 0 0 0 1 Binario 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0001

Luego moví un bit a la izquierda 3, lo que me daría:

Hex: 0 0 0 0 0 0 0 0 8 Binario 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 1000

Luego pongo mi valor de 32 bits en un byte y veo si es igual a 8.

Entonces mi código sería algo como esto:

int value = 0x102F1032;
value = value >> 16;
byte bits = (byte)value << 3;
bits == 8 ? true : false;

¿Existe una forma más sencilla de comprobar si un bit en particular está configurado sin todos los cambios?

preguntado el 08 de noviembre de 11 a las 16:11

Solo necesita usar el operador & bit a bit para esto. -

¿No puedes simplemente escribir (número & 0x00010000)! = 0? -

Solo por curiosidad, aunque cambiar no es la mejor manera de hacer esto, ¿por qué no verificó si el resultado fue 1 después del primer turno? es decir, ¿por qué volver a la izquierda 3? -

@Ray Yes extraña lógica para cambiar a la derecha en una cierta cantidad de lugares y luego cambiar inmediatamente a la izquierda en otra cantidad ... -

@ user489041 pero el bit a la izquierda de su bit probado aún podría establecerse. -

9 Respuestas

Puede utilizar el operador & bit a bit:

int value = 0x102F1032;
int checkBit = 0x00010000;
bool hasBit = (value & checkBit) == checkBit;

respondido 08 nov., 11:20

Es mucho más fácil que eso. Solo usa el bit a bit AND operador como este

(value & 0x00010000) != 0

respondido 08 nov., 11:20

Puedes comprobarlo así:

bool bitSet = (value & 0x10000) == 0x10000;

respondido 08 nov., 11:20

Utiliza bit a bit y operador &:

return (value & 0x100000) != 0;

respondido 08 nov., 11:20

Y si no le gusta el enfoque de la máscara de bits:

int data = 0;

var bits = new BitArray(new int[] { data });

bits.Get(21);

(Es posible que haya obtenido el recuento incorrecto y no es 21 lo que está buscando)

Esto podría ser un poco abusivo para un caso en el que solo tiene 32 bits, pero si necesita trabajar con matrices de bits más largas, esto es mucho más claro.

respondido 08 nov., 11:21

Puede hacer un AND bit a bit.

int result = yourByte & 16;
if (result != 0)
{
    // do what you need to when that bit is set
}

respondido 08 nov., 11:20

Solo ten cuidado con este. 0x10000! = 16. - Ray

puedes decir:

if( (number & 0x00010000 ) != 0 )
{
  //the bit is set...
}

respondido 08 nov., 11:20

int someInt = 8;
int BitToTest = 3;
bool isSet = (someInt & (1 << BitToTest)) != 0;

Y con el valor cambiado, el bit se establece si la respuesta es distinta de cero. Si está haciendo un bit mucho, use una constante para (1 << BitToTest), si es mucho pero bits diferentes, una matriz estática para buscar 2 ^ BitToTest.

respondido 08 nov., 11:21

Además, pero tal vez no mejor, puede usar el BitVector32 estructura.

int value =  0x102F1032;
var vector = new BitVector32(value);
return vector[0x1000]; //true

respondido 09 nov., 11:13

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.