Bit manipulation in C# using a mask

我的未来我决定 提交于 2019-12-10 15:16:59

问题


I need a little help with bitmap operations in C#

I want to take a UInt16, isolate an arbitrary number of bits, and set them using another UInt16 value.

Example:

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

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

回答1:


It seems like you want:

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

The first half zeroes the bits of orig which are in mask. Then you do a bitwise OR against the bits from input that are in mask.




回答2:


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



回答3:


Something like this?

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

This will convert all your sample inputs to your sample outputs. To be more general, you'd want something like this:

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

And you would call this with:

Transform(input, 0x0C, 0xA2);

For the equivalent behavior of the first function.




回答4:


A number of the terser solutions here look plausible, especially JS Bangs', but don't forget that you also have a handy BitArray collection to use in the System.Collections namespace: http://msdn.microsoft.com/en-us/library/system.collections.bitarray.aspx



来源:https://stackoverflow.com/questions/3230830/bit-manipulation-in-c-sharp-using-a-mask

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!