2010-07-12 3 views
5

мне нужна небольшая помощь с растровыми операциями в C#битой манипуляции в C# с использованием маски

Я хочу взять UInt16, изолировать произвольное число бит, и установите их с помощью другого UInt16 значения.

Пример:

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

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

ответ

8

Похоже, вы хотите:

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

Первые половину нулей биты orig, которые находятся в mask. Затем вы выполняете побитовое ИЛИ против бит от input, которые находятся в 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

Нечто подобное?

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

Это преобразует все ваши входы образца в ваши выходные данные. Чтобы быть более общими, вы хотите что-то вроде этого:

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

И вы могли бы назвать это с:

Transform(input, 0x0C, 0xA2); 

Для эквивалентного поведения первой функции.

1

Ряд terser решений здесь выглядит правдоподобно, особенно JS Bangs', но не забывайте, что у вас также есть удобная коллекция BitArray для использования в пространстве имен System.Collections: http://msdn.microsoft.com/en-us/library/system.collections.bitarray.aspx

+0

Я считал это, но он, похоже, не обладает способностью маскировки. Мне потребовалось бы установить или получить каждый бит по отдельности. –

Смежные вопросы