Я нуждаюсь в небольшой помощи с растровыми операциями в C#
Я хочу взять a UInt16
, изолируйте произвольное число битов и установите их использующий другого UInt16
значение.
Пример:
10101010 -- Original Value
00001100 -- Mask - Isolates bits 2 and 3
Input Output
00000000 -- 10100010
00000100 -- 10100110
00001000 -- 10101010
00001100 -- 10101110
^^
Похоже, вы хотите:
(orig & ~mask) | (input & mask)
Первая половина обнуляет биты orig
, которые находятся в маске
. Затем вы выполняете побитовое ИЛИ над битами из входа
, которые находятся в маске
.
Что-то вроде этого?
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);
Для эквивалентного поведения первой функции.
Некоторые краткие решения здесь выглядят правдоподобными, особенно JS Bangs, но не забывайте, что у вас также есть удобная коллекция BitArray для использования в пространстве имен System.Collections: http://msdn.microsoft .com / en-us / library / system.collections.bitarray.aspx
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