2010-07-12 2 views
5

Ich brauche ein wenig Hilfe bei Bitmap-Operationen in C#Bit Manipulation in C# unter Verwendung einer Maske

ich eine UInt16 nehmen wollen, isolieren, eine beliebige Anzahl von Bits und stellte sie eine andere Verwendung UInt16 Wert.

Beispiel:

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

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

Antwort

8

Es scheint, wie Sie wollen:

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

Die erste Hälfte Nullen die Bits orig, die in mask sind. Dann machen Sie ein bitweises ODER gegen die Bits von input, die in mask sind.

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

So etwas wie das?

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

Dies konvertiert alle Ihre Beispieleingaben in Ihre Beispielausgaben. Um allgemeiner zu sein, würden Sie so etwas wie dies wollen:

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

Und Sie nennen würde dies mit:

Transform(input, 0x0C, 0xA2); 

Für das Äquivalent Verhalten der ersten Funktion.

1

Eine Reihe der knapperen Lösungen hier plausibel, vor allem JS Bangs', aber vergessen Sie nicht, dass Sie auch eine praktische BitArray Sammlung im System.Collections-Namespace zu verwenden: http://msdn.microsoft.com/en-us/library/system.collections.bitarray.aspx

+0

Ich dachte darüber nach, aber es scheint keine Maskierungsfähigkeit zu haben. Es würde erfordern, dass ich jedes Bit einzeln setze oder erhalte. –

Verwandte Themen