确定位掩码中的值
本文关键字:掩码 定位 | 更新日期: 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;