如何检查C#使用和时是否存在位?

如何检查C#使用和时是否存在位?,c#,active-directory,byte,boolean-logic,C#,Active Directory,Byte,Boolean Logic,如何使用逻辑运算符确定是否设置了位,或者位移位是唯一的方法 我发现它使用了位移位,但我认为我可以和计算出我的值 对于某些上下文,我正在从Active Directory读取一个值,并试图确定它是否是架构基对象。我认为我的问题是语法问题,但我不知道如何纠正它 foreach (DirectoryEntry schemaObjectToTest in objSchema.Children) { var resFlag = schemaObjectToTest.

如何使用逻辑运算符确定是否设置了位,或者位移位是唯一的方法

我发现它使用了位移位,但我认为我可以
计算出我的值

对于某些上下文,我正在从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
是一个
对象{int}
,其值为
0x00000010

isFlag\u Schema\u Base\u Object
0x02
resFlag
0x00000010
,十进制为16,二进制为
10000
。因此,似乎您想要测试位4(位0是最低有效位),尽管您的注释说“如果设置了位10”

如果确实需要测试位4,则需要将
isFlag\u Schema\u Base\u Object
初始化为16,即
0x10

无论如何,您是对的-您不需要进行位移位来查看是否设置了位,您可以
使用刚刚设置了该位的常量的值,并查看结果是否为非零

如果设置了位:

                 original  xxx1xxxx
                      AND
isFlag_Schema_Base_Object  00010000
-----------------------------------
                        =  00010000 (non-zero)
但如果未设置位:

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

话虽如此,如果您知道要检查哪个位,并且您正在处理可以使用的int,那么使用值
1初始化
isFlag\u Schema\u Base\u Object
可能会更清楚


使用位移位可能比使用CreateMask更干净。但它就在那里:)

只是为了澄清一下,如果resflag为:0x0001010,我的和是否会非零?这就是我的目标。是的-只要
isFlag\u Schema\u Base\u Object
本身只设置了一个位,那么
将其与
original
进行比较就会得到零(如果设置了位),或者
isFlag\u Schema\u Base\u Object
(非零,意味着设置了位)。您可以测试结果是零/非零,还是等于/不等于
isFlag\u Schema\u Base\u Object
。这些测试是等效的。如果你有任何疑问,试试看:-)@MakerOfThings7:是的。AND将导致其他位为0,但要检查的位为1(如果且仅当要检查的位已设置)。
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];