2010-09-29 58 views
2

如何使用逻辑运算符来确定是否设置了位,或者是位移的唯一方式?如何使用AND检查C#中是否存在一点?

我发现这个question使用位移,但我想我可以只AND出我的价值。

对于某些上下文,我从Active Directory中读取一个值并尝试确定它是否是架构基础对象。我认为我的问题是一个语法问题,但我不知道如何纠正它。

foreach (DirectoryEntry schemaObjectToTest in objSchema.Children) 
     { 
      var resFlag = schemaObjectToTest.Properties["systemFlags"].Value; 
      //if bit 10 is set then can't be made confidential. 
      if (resFlag != null) 
      { 
       byte original = Convert.ToByte(resFlag); 
       byte isFlag_Schema_Base_Object = Convert.ToByte(2); 
       var result = original & isFlag_Schema_Base_Object; 
       if ((result) > 0) 
       { 
         //A non zero result indicates that the bit was found 
       } 
      } 
     } 

当我看到调试器: resFlag是一个object{int}和值是0x00000010isFlag_Schema_Base_Object,是0x02

回答

7

resFlag0x00000010是16十进制或二进制10000。所以看起来你想测试第4位(第0位是最低位),尽管你的评论说“如果第10位已设置”。

如果确实需要测试第4位,则需要将isFlag_Schema_Base_Object初始化为16,即0x10

无论如何,你是对的 - 你不需要做位移来查看是否设置了一位,你可以AND这个值设置了一个常数,并且看看结果是否是非零的。零。

如果该位被设置:

    original xxx1xxxx 
         AND 
isFlag_Schema_Base_Object 00010000 
----------------------------------- 
         = 00010000 (non-zero) 

但是,如果该位未设置:

    original xxx0xxxx 
         AND 
isFlag_Schema_Base_Object 00010000 
----------------------------------- 
         = 00000000 (zero) 

话虽如此,它可能是更清晰的使用值1<<4初始化isFlag_Schema_Base_Object,以明确说明你正在测试是否设置了位4。

+0

只是澄清,如果resflag是我的AND是非零:0x00011010?这是我的目标。 – LamonteCristo 2010-09-29 18:22:01

+0

是的 - 只要'isFlag_Schema_Base_Object'本身只设置了一个位,那么'用AND'与'original'将会给你零(如果该位被设置)或'isFlag_Schema_Base_Object'(非零,意味着位被设置)。您可以测试结果是否为零/非零,或者是否等于/不等于'isFlag_Schema_Base_Object'。这些测试是相同的。如果你有任何疑问,试试看:-) – 2010-09-29 18:25:46

+0

@ MakerOfThings7:是的。你的AND将导致0为其他位,但1为你正在检查的(如果并且只有当你正在检查的那个位被设置)。 – 2010-09-29 18:26:36

0

如果您知道要检查哪个位,并且您正在处理int,则可以使用BitVector32

int yourValue = 5; 
BitVector32 bv = new BitVector32(yourValue); 
int bitPositionToCheck = 3; 
int mask = Enumerable.Range(0, bitPositionToCheck).Select(BitVector32.CreateMask).Last(); 
bool isSet = bv[mask]; 

使用位移可能比使用CreateMask更清洁。但它在那里:)

相关问题