确定位掩码中的值

时间:2014-11-26 13:55:04

标签: c#

我有一个硬件协议指南,我可以提取16种不同的数据。为了表明我想要所有数据,我将输入65535作为掩码。

  2^0  (1)
+ 2^1  (2)
+ 2^2  (4)    
...    
+ 2^15  (32768)
==============
65535

我现在需要表明我需要选项9,10和13.大概我只需要使用以下计算:

  2^9   (512)
+ 2^10  (1024)
+ 2^13  (8192)
==============
9728

(如果我在这里偏离基础,或者有一种编程方式来做到这一点,我有兴趣知道!)

我想知道的是我将来如何提取总和中涉及的所有数字。

我以为我可以查看(9728 & 9) == 9(9728 & 10) == 10(9728 & 13) == 13,但所有这些都会返回false。

2 个答案:

答案 0 :(得分:6)

第9位是256;第10位是512;第13位是4096。

所以:

if((val & 256) != 0) { /* bit 9 is set */ }
if((val & 512) != 0) { /* bit 10 is set */ }
if((val & 4096) != 0) { /* bit 13 is set */ }

为方便起见,您还可以使用枚举:

[Flags]
public enum MyFlags {
     None = 0,
     Foo = 1,
     Bar = 2,
     ...
     SomeFlag = 256,
     AnotherFlag = 512,
     ...
}

然后:

MyFlags flags = (MyFlags)val;
if((flags & MyFlags.SomeFlag) != 0) {/* SomeFlag is set */}

同样地:

MyFlags thingsWeWant = MyFlags.Foo | MyFlags.SomeFlag | MyFlags.AnotherFlag;
int val = (int)thingsWeWant;

答案 1 :(得分:2)

这意味着什么?

var value = 512 | 1024 | 8192;

var pos = 9;
var isSetNine = (value & (1 << pos)) != 0;