2010-07-12 6 views
5

Ho bisogno di un piccolo aiuto con le operazioni bitmap in C#manipolazione Bit in C# utilizzando una maschera

voglio prendere un UInt16, isolare un numero arbitrario di bit, e li utilizzando un altro valore UInt16.

Esempio:

10101010 -- Original Value 
00001100 -- Mask - Isolates bits 2 and 3 

Input  Output 
00000000 -- 10100010 
00000100 -- 10100110 
00001000 -- 10101010 
00001100 -- 10101110 
       ^^ 

risposta

8

sembra che si desidera:

(orig & ~mask) | (input & mask) 

I semestre Primo zeri i bit di orig che sono in mask. Quindi si esegue un OR bit a bit contro i bit da input che si trovano in mask.

4
newValue = (originalValue & ~mask) | (inputValue & mask); 

originalValue -> 10101010 
inputValue -> 00001000 
mask   -> 00001100 
~mask   -> 11110011 

(originalValue & ~mask) 
    10101010 
& 11110011 
---------- 
    10100010 
     ^^ 
     Cleared isolated bits from the original value 

(inputValue & mask) 
    00001000 
& 00001100 
---------- 
    00001000 


newValue =  
    10100010 
| 00001000 
---------- 
    10101010 
1

Qualcosa di simile?

static ushort Transform(ushort value){ 
    return (ushort)(value & 0x0C/*00001100*/ | 0xA2/*10100010*/); 
} 

Questo convertirà tutti gli ingressi del campione in uscite campione. Per essere più generale, che ci si vuole qualcosa di simile:

static ushort Transform(ushort input, ushort mask, ushort bitsToSet){ 
    return (ushort)(input & mask | bitsToSet & ~mask); 
} 

E si potrebbe chiamare questo con:

Transform(input, 0x0C, 0xA2); 

per il comportamento equivalente della prima funzione.

1

Un certo numero di soluzioni terser qui sembrano plausibili, in particolare JS Bangs', ma non dimenticate che anche voi avete una collezione BitArray comodo da usare nel System.Collections namespace: http://msdn.microsoft.com/en-us/library/system.collections.bitarray.aspx

+0

Ho considerato questo, ma non sembra avere una capacità di mascheramento. Mi richiederebbe di impostare o ottenere ogni bit individualmente. –