我需要一点C#
中位图操作的帮助我想取一个UInt16
,隔离任意数量的位,并使用另一个UInt16
值设置它们。
示例:
10101010 -- Original Value
00001100 -- Mask - Isolates bits 2 and 3
Input Output
00000000 -- 10100010
00000100 -- 10100110
00001000 -- 10101010
00001100 -- 10101110
^^
答案 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