2010-09-29 41 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更清潔。但它在那裏:)

相關問題