2009-11-02 11 views
11

C'è un modo per convertire un int in una maschera di bit?come convertire un int in una maschera di bit?

esempio:

int i = 33; 

dovrebbe essere convertito (non sono sicuro del tipo di dati)

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

Aggiornamento
In reazione alla maggior parte delle risposte:

che devo fare this:

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')); 
} 

Come sarebbe senza convertirlo in un bitarray?

risposta

28

Un int è già una maschera di bit. Se si desidera modificare i bit, è possibile utilizzare liberamente operatori bit per bit su ints. Se si desidera convertire int in un enum con l'attributo Flags, sarà sufficiente un cast semplice.

+3

E se è necessario accedere al bit di ith (con i nomi di 0 indicizzati), utilizzare '1 << i'. – Brian

+0

Lo controllerò. Grazie :) –

5

È possibile costruire un bool[32] e scorrere tutti i bit nel int, mascherarlo con 2^(contatore loop) e impostando le bool s nell'array appropriato.

Sei sicuro di aver bisogno di questo? La maggior parte delle operazioni con le maschere bit funzionano direttamente con gli inte.

Per rispondere alla domanda nella tua modifica:

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')); 
    } 
} 

stampe:

01 
02 
06 

Non è la soluzione più ovvia, se non siete abituati a po 'di aritmetica, vero. Mascherare ogni bit nel valore intero con 2^(bit-index), e se il valore risultante è maggiore di zero (indicando che il bit di quell'indice è impostato), fare qualcosa. 1 << i (spostamento a sinistra) è equivalente a 2^i e potrebbe avere le stesse caratteristiche di prestazioni una volta JITted, ma sono abituato a questo modulo.

Espresso in macro-come metodo:

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

trovato

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

Probabilmente scoprirai che il metodo in che @JS Bangs ha suggerito sarà molto più veloce. – Kieron

+0

Beh, è ​​una conversione così piccola, difficilmente importa.Ma per correttezza mi piacerebbe imparare :) –

+2

C'è un esempio su 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

Mi piace. Per coloro che sono interessati, il metodo Cast è un metodo di estensione e richiede "using System.Linq" dichiarazione che in Mono richiede un riferimento a System.Core –

2

Dal momento che si chiede, ecco una soluzione senza utilizzare 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')); 
} 

Si tratta della stessa quantità di codice, con negligib la differenza di prestazioni. Tuttavia, ti consente di definire con precisione i valori dei bit e puoi scegliere di omettere i bit nell'enumerazione BitFlags di cui non ti importa.

+0

Grazie. Non sapevo che fosse possibile. Un altro strumento nella mia cintura :) –

Problemi correlati