2009-11-02 16 views
11

¿Hay alguna manera de convertir un int a una máscara de bits?cómo convertir un int a una máscara de bits?

ejemplo:

int i = 33; 

deben convertirse en (no estoy seguro del tipo de datos)

bool[] bitmask = new[] {true, false, false, false, false, true}; 

actualización
En reacción a la mayoría de las respuestas:

que tengo que hacer esto:

BitArray bits = new BitArray(BitConverter.GetBytes(showGroup.Value)); 
List<String> showStrings = new List<string>(); 
for (int i = 0; i < bits.Length; i++) 
{ 
    if(bits[i]) 
     showStrings.Add((i+1).ToString().PadLeft(2, '0')); 
} 

¿Cómo sería eso sin convertirlo en un bitarray?

Respuesta

28

Un int ya es una máscara de bits. Si quiere mezclar los bits, puede usar operadores bit a bit libremente en las entradas. Si desea convertir el int a una enumeración que tiene el atributo Flags, bastará un simple molde.

+3

Y si necesita acceder al bit i-ésimo (con i indexado en 0), use '1 << i'. – Brian

+0

Lo comprobaré. Gracias :) –

5

Puede construir un bool[32] y recorrer todos los bits en el int, enmascararlo con 2^(contador de bucle) y configurar el bool s en la matriz de forma adecuada.

¿Estás seguro de que necesitas esto? La mayoría de las operaciones con máscara de bits funcionan directamente con Ints.

Para responder a la pregunta en su edición:

int val = 35; 
List<string> showStrings = new List<string>(); 
for (int i = 0; i < 32; i++) 
{ 
    if (((1 << i) & val) > 0) 
    { 
     showStrings.Add((i + 1).ToString().PadLeft(2, '0')); 
    } 
} 

impresiones:

01 
02 
06 

No es la solución más obvia si usted no está acostumbrado a la aritmética poco, es cierto. Enmascare cada bit en el valor entero con 2^(bit-index), y si el valor resultante es mayor que cero (lo que indica que el bit en ese índice está establecido), haga algo. 1 << i (desplazamiento a la izquierda) es equivalente a 2^i, y puede tener las mismas características de rendimiento una vez JITted, pero estoy acostumbrado a este formulario.

Expresado como una macro-como método:

bool IsSet(int val, int index) 
{ 
    return (((1 << (index-1)) & val) > 0); 
} 
12

lo encontró

BitArray bits = new BitArray(System.BitConverter.GetBytes(showGroup.Value)); 
+0

Probablemente descubras que el método que @JS Bangs sugirió será mucho más rápido. – Kieron

+0

Bueno, es una conversión tan pequeña que apenas importará.Pero por el bien de la corrección me encantaría aprender :) –

+2

Hay un ejemplo en SO: http://stackoverflow.com/questions/8447/enum-flags-attribute – Groo

3
int val = 33; 
var bitarray = new BitArray(new[] { val }); 
var att = bitarray.Cast<bool>().ToArray(); 
+0

Me gusta esto. Para aquellos interesados, el método Cast es un Método de Extensión y requiere la declaración "using System.Linq" que bajo Mono requiere una referencia a System.Core –

2

Dado que usted pidió, aquí es una solución sin utilizar BitArray:

// First define a bitmask enum for the bits you are interested in 
[Flags] 
public enum BitFlags 
{ 
    Flag1 = 1, 
    Flag2 = 2, 
    Flag3 = 4, 
    Flag4 = 8, 
    Flag5 = 16 
    // ... 
} 

int index = 0; 
List<string> showStrings = new List<string>(); 
foreach(int flag in Enum.GetValues(typeof(BitFlags))cast<int>()) 
{ 
    index += 1; 
    if ((input & flag) == flag) 
    showStrings.Add(index.ToString().PadLeft(2, '0')); 
} 

Se trata de la misma cantidad de código, con insignigib le diferencia de rendimiento. Sin embargo, le permite definir fuertemente sus valores de bit y puede optar por omitir bits en la enumeración de BitFlags que no le interesan.

+0

Gracias. No sabía que esto fuera posible. Otra herramienta en mi cinturón :) –