Манипулирование битами в C # с использованием маски - PullRequest
5 голосов
/ 12 июля 2010

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

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

Пример:

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

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

Ответы [ 4 ]

8 голосов
/ 12 июля 2010

Кажется, что вы хотите:

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

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

4 голосов
/ 12 июля 2010
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 голос
/ 12 июля 2010

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

1 голос
/ 12 июля 2010

Как-то так?

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);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...