• Blog
  • Bio

Eric Boumendil

Petit memento sur les opérations sur les bits en C#

20 octobre 2009 // archives .net c#
Cet article est très ancien. Les choses ont bien changées depuis 2009. Le sujet abordé est conservé pour référence mais n'est certainement plus applicable en l'état.
Cet article est susceptible de référencer des images manquantes ou de contenir des erreurs de formatage sur son contenu. Il s'agit d'un import provenant d'un ancien blog.

Un aide-mémoire des opérations bit à bit les plus courantes en C#: la manipulation des quartets d’un octet, puis celle des groupes de bits utilisés comme drapeaux.

Opérations sur quartets

Concaténer deux quartets en un octet

byte q1 = 0xc0;
byte q2 = 0x03;
Console.WriteLine("Q1 = 0x" + q1.ToString("X2"));
Console.WriteLine("Q1 = 0x" + q2.ToString("X2"));
Console.WriteLine();

byte b =(byte)(q1 | q2);
Console.WriteLine("Q1 | Q2 = 0x" + b.ToString("X2") + " (B)");
Console.WriteLine();

// Affiche:
// Q1 = 0xC0
// Q2 = 0x03
// Q1 | Q2 = 0xC3

Extraire un quartet

Premier quartet (poids fort, le plus à gauche)

Si on veut obtenir 0xC0 à partir de 0xC3:

byte b = 0xC3;
Console.WriteLine("0x" + b.ToString("X2") + " & 0xF0 = 0x" + (b & 0xF0).ToString("X2"));

// Affiche:
// 0xC3 & 0xF0 = 0xC0

Si on veut obtenir 0x0C à partir de 0xC3:

byte b = 0xC3;
Console.WriteLine("0x" + b.ToString("X2") + " >> 4 = 0x" + (b >> 4).ToString("X2"));

// Affiche:
// 0xC3 >> 4 = 0x0C

Deuxième quartet (poids faible, le plus à droite)

byte b = 0xC3;
Console.WriteLine("0x" + b.ToString("X2") + " & 0x0F = 0x" + (b & 0x0F).ToString("X2"));

// Affiche:
// 0xC3 & 0x0F = 0x03

Opérations sur flags

Bien qu’on utilise plus souvent ces opérations sur des enum, je garde la représentation hexadécimale pour ces exemples.

Activer un groupe de bits (OR)

(similaire au premier exemple)

byte b= 0x04; // 0100
byte bits = 0x03; // 0011
Console.WriteLine("0x" + b.ToString("X2") + " | " + "0x" + bits.ToString("X2") + " = 0x" + (b | bits)); // 0111

// Affiche:
// 0x04 | 0x03 = 0x07

Désactiver un groupe de bits (AND NOT)

byte b= 0x07; // 0111
byte bits = 0x03; // 0011
Console.WriteLine("0x" + b.ToString("X2") + " & ~0x" + bits.ToString("X2") + " = 0x" + (b &  ~bits)); // 0100

// Affiche:
// 0x07 & ~0x03 = 0x04

Inverser un groupe de bits (XOR)

Celui-là, il est facile à retenir!

byte b= 0x04; // 0100
byte bits = 0x03; // 0011
Console.WriteLine("0x" + b.ToString("X2") + " ^ " + "0x" + bits.ToString("X2") + " = 0x" + (b ^ bits)); // 0111

// Affiche:
// 0x04 ^ 0x03 = 0x07

Vérifier l’état d’un groupe de bits (AND)

C’est malheureusement très verbeux…

byte b= 0x07; // 0111
byte bits = 0x04; // 0100
if ((b & bits) == bits)
    Console.WriteLine("0x" + b.ToString("X2") + " contient 0x" + bits.ToString("X2"));

// Affiche:
// 0x07 contient 0x04.

Voir aussi :

http://www.codeproject.com/KB/cs/leftrightshift.aspx

(un bon tutoriel sur chaque opérateur sur bits en C#).

← 
Apache2: Mise en place de plusieurs sites web sur un même serveur
Indenter un flux XML
 →
 
© 2026 Eric Boumendil
Haut de page