Accueil du site > Informatique > Champs de bits (Bit Fields) en C# avec un BitVector32

Champs de bits (Bit Fields) en C# avec un BitVector32

mercredi 11 mars 2009, par Raccoon

En C++, on peut définir des champs de bits :

struct Date
{    
   unsigned nWeekDay  : 3;    // 0..7   (3 bits)
   unsigned nMonthDay : 6;    // 0..31  (6 bits)
   unsigned nMonth    : 5;    // 0..12  (5 bits)
   unsigned nYear     : 8;    // 0..100 (8 bits)
};

En C#, les champs de bits n’existent pas, mais on peut les simuler. L’exemple précédent devient :

   class Date
   {
       private BitVector32 bv = new BitVector32();

       private static BitVector32.Section sWeekDay, sMonthDay, sMonth, sYear;

       static Date()
       {
           sWeekDay = BitVector32.CreateSection(7);
           sMonthDay = BitVector32.CreateSection(31, sWeekDay);
           sMonth = BitVector32.CreateSection(12, sMonthDay);
           sYear = BitVector32.CreateSection(100, sMonth);
       }

       public int nWeekDay
       {
           get { return bv[sWeekDay]; }
           set { bv[sWeekDay] = value; }
       }

       public int nMonthDay
       {
           get { return bv[sMonthDay]; }
           set { bv[sMonthDay] = value; }
       }

       public int nMonth
       {
           get { return bv[sMonth]; }
           set { bv[sMonth] = value; }
       }

       public int nYear
       {
           get { return bv[sYear]; }
           set { bv[sYear] = value; }
       }
   }

Avantages
- Comme en C++ : on utilise très peu de place mémoire. Chaque instance n’occupe que 32 bits.
- La fonction CreateSection() prend en argument le maximum de la valeur qu’on veut stocker. Plus besoin de calculer à la main le nombre de bits à utiliser (il faut juste s’assurer que le total n’excède pas 32).

Inconvénients

- c’est un peu plus lourd à écrire.
- On ne peut pas stocker plus de 32 bits dans un BitVector32. Si on a besoin de plus de place, il faudra en créer plusieurs, ou utiliser un BitArray à la place, mais ce sera plus complexe à écrire ...

2 Messages de forum

Répondre à cet article

SPIP | | Plan du site | Suivre la vie du site RSS 2.0