使用掩码在C#中进行位操作

时间:2010-07-12 17:53:20

标签: c# bit-manipulation

我需要一点C#

中位图操作的帮助

我想取一个UInt16,隔离任意数量的位,并使用另一个UInt16值设置它们。

示例:

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

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

4 个答案:

答案 0 :(得分:8)

好像你想要:

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

前半部分将orig中的mask位置为input。然后,对mask中的{{1}}中的位进行按位OR运算。

答案 1 :(得分: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

答案 2 :(得分: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);

对于第一个函数的等效行为。

答案 3 :(得分:1)

这里的一些terser解决方案看似合理,尤其是JS Bangs',但不要忘记你还有一个方便的BitArray集合可以在System.Collections命名空间中使用:http://msdn.microsoft.com/en-us/library/system.collections.bitarray.aspx