Побитовая обработка в C# с помощью маски

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

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

Пример:

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

Input        Output
00000000  -- 10100010
00000100  -- 10100110
00001000  -- 10101010
00001100  -- 10101110
                 ^^
5
задан Robert Harvey 12 July 2010 в 18:02
поделиться

4 ответа

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

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

Первая половина обнуляет биты orig , которые находятся в маске . Затем вы выполняете побитовое ИЛИ над битами из входа , которые находятся в маске .

8
ответ дан 18 December 2019 в 13:10
поделиться

Что-то вроде этого?

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
ответ дан 18 December 2019 в 13:10
поделиться

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

1
ответ дан 18 December 2019 в 13:10
поделиться
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
4
ответ дан 18 December 2019 в 13:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: