2

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

我发现这个问题使用位移,但我认为我可以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

4

2 回答 2

7

resFlag0x00000010十进制的 16 或10000二进制的 16。因此,您似乎想测试第 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话虽如此,使用 value进行初始化可能更清楚1<<4,以明确您正在测试是否设置了第 4 位。

于 2010-09-29T18:15:07.557 回答
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 更干净。但它就在那里:)

于 2010-09-29T18:31:11.200 回答