2010-07-12 4 views
5

je besoin d'un peu d'aide avec les opérations bitmap en C#manipulation de bits en C# en utilisant un masque

Je veux prendre un UInt16, isoler un nombre arbitraire de bits, et mettez-les en utilisant une autre valeur UInt16.

Exemple:

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

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

Répondre

8

Il semble que vous voulez:

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

La première moitié de zéros les bits orig qui sont en mask. Ensuite, vous faites un bit OU contre les bits de input qui sont dans 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

Quelque chose comme ça?

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

Ceci convertira toutes vos entrées d'échantillons en sorties d'échantillons. Pour être plus général, vous voulez quelque chose comme ceci:

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

Et vous appelez cela avec:

Transform(input, 0x0C, 0xA2); 

Pour le comportement équivalent de la première fonction.

1

Un certain nombre de solutions TERSER regardez ici plausible, surtout JS Bangs', mais ne pas oublier que vous avez aussi une collection de BitArray pratique à utiliser dans l'espace de noms System.Collections: http://msdn.microsoft.com/en-us/library/system.collections.bitarray.aspx

+0

je considérais, mais il ne semble pas avoir une capacité de masquage. Il faudrait que je mette ou obtienne chaque bit individuellement. –