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