我有一个硬件协议指南,我可以提取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。
答案 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;