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

时间:2010-09-29 18:07:44

标签: c# active-directory byte boolean-logic

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

我发现这个question使用了位移,但我认为我只能AND我的价值。

对于某些上下文,我正在从Active Directory读取值并尝试确定它是否为Schema Base Object。我认为我的问题是语法问题,但我不确定如何纠正它。

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
                }
            }
        }

当我查看调试器时: resFlagobject{int},值为0x00000010isFlag_Schema_Base_Object0x02

2 个答案:

答案 0 :(得分: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)

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

答案 1 :(得分: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];

使用bitshifting可能比使用CreateMask更清晰。但它在那里:)