Vérifier si un bit est défini ou non

Comment vérifier si un certain bit dans un octet est défini?

bool IsBitSet(Byte b,byte nPos) { return .....; } 

sonne un peu comme les devoirs, mais:

 bool IsBitSet(byte b, int pos) { return (b & (1 << pos)) != 0; } 

la pos 0 est le bit le moins significatif, la pos 7 la plus.

Sur la base de la réponse de Mario Fernandez , je pensais que pourquoi ne pas l’avoir dans ma boîte à outils en tant que méthode d’extension pratique non limitée au type de données, alors j’espère que vous pouvez la partager ici:

 ///  /// Returns whether the bit at the specified position is set. ///  /// Any integer type. /// The value to check. ///  /// The position of the bit to check, 0 refers to the least significant bit. ///  /// true if the specified bit is on, otherwise false. public static bool IsBitSet(this T t, int pos) where T : struct, IConvertible { var value = t.ToInt64(CultureInfo.CurrentCulture); return (value & (1 << pos)) != 0; } 

Voici la solution en mots.

Décalez à gauche un entier avec la valeur initiale 1 n fois, puis effectuez un AND avec l’octet d’origine. Si le résultat est non nul, le bit est défini autrement que non. 🙂

Cela fonctionne également (testé dans .NET 4):

 void Main() { //0x05 = 101b Console.WriteLine(IsBitSet(0x05, 0)); //True Console.WriteLine(IsBitSet(0x05, 1)); //False Console.WriteLine(IsBitSet(0x05, 2)); //True } bool IsBitSet(byte b, byte nPos){ return new BitArray(new[]{b})[nPos]; } 

Déplacer vers la droite vos n bits d’entrée et masquer avec 1, puis testez si vous avez 0 ou 1.

 x == (x | Math.Pow(2, y)); int x = 5; x == (x | Math.Pow(2, 0) //Bit 0 is ON; x == (x | Math.Pow(2, 1) //Bit 1 is OFF; x == (x | Math.Pow(2, 2) //Bit 2 is ON; 

Equivalent au code Mario F, mais en déplaçant l’octet au lieu du masque:

 bool IsBitSet(byte b, int pos) { return ((b >> pos) & 1) != 0; } 

quelque chose comme

 return ((0x1 << nPos) & b) != 0 

Pour vérifier les bits dans un mot de 16 bits:

  Int16 WordVal = 16; for (int i = 0; i < 15; i++) { bitVal = (short) ((WordVal >> i) & 0x1); sL = Ssortingng.Format("Bit #{0:d} = {1:d}", i, bitVal); Console.WriteLine(sL); }