2 votes

Comment vérifier la présence d'un bit en C# en utilisant AND ?

Comment utiliser les opérateurs logiques pour déterminer si un bit est défini, ou est le décalage de bits la seule solution ?

J'ai trouvé cette question qui utilise le décalage de bits, mais je pense que je peux simplement AND ma valeur.

Pour un peu de contexte, je lis une valeur dans Active Directory et j'essaie de déterminer s'il s'agit d'un objet de base de schéma. Je pense que mon problème est un problème de syntaxe, mais je ne sais pas comment le corriger.

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)
                {
                       //Un résultat non nul indique que le bit a été trouvé
                }
            }
        }

Lorsque je regarde le débogueur : resFlag est un object{int} et la valeur est 0x00000010. isFlag_Schema_Base_Object est 0x02

7voto

Richard Fearn Points 11631

resFlag est 0x00000010, ce qui équivaut à 16 en décimal, ou 10000 en binaire. Il semble donc que vous vouliez tester le bit 4 (le bit 0 étant le bit le moins significatif), malgré votre commentaire disant "si le bit 10 est défini".

Si vous avez besoin de tester le bit 4, alors isFlag_Schema_Base_Object doit être initialisé à 16, ce qui équivaut à 0x10.

Quoi qu'il en soit, vous avez raison - vous n'avez pas besoin de décaler les bits pour voir si un bit est défini, vous pouvez faire un ET de la valeur avec une constante qui a juste ce bit défini, et voir si le résultat est différent de zéro.

Si le bit est défini :

                 original  xxx1xxxx
                      ET
isFlag_Schema_Base_Object  00010000
-----------------------------------
                        =  00010000 (différent de zéro)

Mais si le bit n'est pas défini :

                 original  xxx0xxxx
                      ET
isFlag_Schema_Base_Object  00010000
-----------------------------------
                        =  00000000 (zéro)

Cela dit, il serait peut-être plus clair d'initialiser isFlag_Schema_Base_Object en utilisant la valeur 1<<4, pour indiquer clairement que vous testez si le bit 4 est défini.

0voto

Mikael Svenson Points 18243

Si vous savez quel bit vérifier et que vous manipulez des int, vous pouvez utiliser BitVector32.

int votreValeur = 5;
BitVector32 bv = new BitVector32(votreValeur);
int positionBitAControler = 3;
int masque = Enumerable.Range(0, positionBitAControler).Select(BitVector32.CreateMask).Last();
bool estPositionne = bv[masque];

Utiliser des décalages de bits est probablement plus propre que d'utiliser CreateMask. Mais cette solution existe :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X