2010-07-12 34 views
5

necesito un poco de ayuda con las operaciones de mapa de bits en C#manipulación de bits en C# usando una máscara

Quiero tomar un UInt16, aislar un número arbitrario de bits, y los puso a utilizar otro valor UInt16.

Ejemplo:

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

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

Respuesta

8

Parece que usted quiere:

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

La primera mitad ceros los bits de orig que están en mask. A continuación, realiza un O a nivel de bits contra los bits de input que están en 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

¿Alló como este?

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

Esto convertirá todas sus entradas de muestra a sus salidas de muestra. Para ser más general, que querría algo así:

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

Y ustedes llamarían esto con:

Transform(input, 0x0C, 0xA2); 

Para el comportamiento equivalente de la primera función.

1

Varias de las soluciones más concisa aquí parecen plausibles, especialmente JS Bangs', pero no se olvide que usted también tiene una colección BitArray útil para usar en el espacio de nombres System.Collections: http://msdn.microsoft.com/en-us/library/system.collections.bitarray.aspx

+0

yo consideraba esto, pero no parece tener una capacidad de enmascaramiento. Me requeriría establecer o obtener cada bit de forma individual. –

Cuestiones relacionadas