如何使用AND检查C#中是否存在某个位?

goo*_*ate 2 c# byte boolean-logic active-directory

如何使用逻辑运算符来确定某个位是否已设置,或者是唯一的位移位?

我发现这个问题使用了位移,但我认为我可以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
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

当我查看调试器时: resFlagobject{int}和,值是0x00000010. isFlag_Schema_Base_Object是的0x02

Ric*_*arn 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)
Run Code Online (Sandbox Code Playgroud)

但如果未设置该位:

                 original  xxx0xxxx
                      AND
isFlag_Schema_Base_Object  00010000
-----------------------------------
                        =  00000000 (zero)
Run Code Online (Sandbox Code Playgroud)

话虽如此,isFlag_Schema_Base_Object使用该值初始化可能更清楚1<<4,以明确您正在测试是否设置了第4位.