Fácil. Utilice un AND bit a bit para comparar su número con el valor 2 ^ bitNumber, que puede calcularse de forma económica mediante el desplazamiento de bits.
//your black magic
var bit = (b & (1 << bitNumber-1)) != 0;
EDITAR: Para agregar un poco más de detalle porque hay muchas respuestas similares sin explicación:
Un AND bit a bit compara cada número, bit a bit, usando una unión AND para producir un número que es la combinación de bits donde se establecieron tanto el primer bit como el segundo bit en ese lugar. Aquí está la matriz lógica de la lógica AND en un "nibble" que muestra el funcionamiento de un AND bit a bit:
0101
& 0011
----
0001 //Only the last bit is set, because only the last bit of both summands were set
En su caso, comparamos el número que pasó con un número que solo tiene el bit que desea buscar. Digamos que estás buscando el cuarto bit:
11010010
& 00001000
--------
00000000 //== 0, so the bit is not set
11011010
& 00001000
--------
00001000 //!= 0, so the bit is set
El cambio de bits, para producir el número con el que queremos comparar, es exactamente lo que parece: tome el número, representado como un conjunto de bits, y mueva esos bits hacia la izquierda o hacia la derecha en un cierto número de lugares. Debido a que estos son números binarios y, por lo tanto, cada bit es una potencia de dos mayor que el que está a su derecha, el desplazamiento de bits a la izquierda equivale a duplicar el número una vez por cada lugar que se desplaza, equivalente a multiplicar el número por 2 ^ x. En su ejemplo, buscando el cuarto bit, realizamos:
1 (2^0) << (4-1) == 8 (2^3)
00000001 << (4-1) == 00001000
Ahora sabe cómo se hace, qué está sucediendo en el nivel bajo y por qué funciona.
var bit = (b & (1 << bitNumber-1)) != 0
;Si bien es bueno leer y comprender la respuesta de Josh, probablemente estará más feliz usando la clase que Microsoft proporcionó para este propósito: System.Collections.BitArray Está disponible en todas las versiones de .NET Framework.
fuente
Esta
debería hacerlo, creo.
fuente
otra forma de hacerlo :)
fuente
((2 >> 1)&1)
es1
y((2 >> 0)&1)
es0
porque 2 es00000010
Esto funciona más rápido que 0,1 milisegundos.
fuente
Usando la clase BitArray y haciendo un método de extensión como OP sugiere:
fuente
prueba esto:
fuente
El método consiste en utilizar otro byte junto con un AND bit a bit para enmascarar el bit de destino.
Usé la convención de mis clases aquí donde "0" es el bit más significativo y "7" es el mínimo.
fuente
Pruebe el siguiente código. La diferencia con otras publicaciones es que puede establecer / obtener múltiples bits usando una máscara (
field
). La máscara para el cuarto bit puede ser 1 << 3, o 0x10, por ejemplo.** Ejemplo **
fuente
fuente