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

デバッガーを見ると: resFlagobject{int}で、値は0x00000010です。 isFlag_Schema_Base_Object、 は0x02

4

2 に答える 2

7

resFlag0x00000010、10 進数または 2 進数で 1610000です。したがって、「ビット10が設定されている場合」というコメントにもかかわらず、ビット4(ビット0が最下位ビット)をテストしたいようです。

ビット 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)

そうは言っても、ビット4が設定されているかどうかをテストしていることを明確にするためにisFlag_Schema_Base_Object、値を使用して初期化する方が明確かもしれません。1<<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 に答える