确定位掩码中的值

本文关键字:掩码 定位 | 更新日期: 2023-09-27 18:32:09

我有一个硬件的协议指南,我可以在其中提取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来检查,但所有这些都返回了错误。

确定位掩码中的值

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

是这样的意思吗?

var value = 512 | 1024 | 8192;
var pos = 9;
var isSetNine = (value & (1 << pos)) != 0;