Oui, il ne sont pas toujours au même endroit, mais on connait leur emplacement, donc on peut calculer un masque avec une puissance de deux (ou avec un décalage, ce qui revient au même).
Pour mettre un bit à un on fait un OR avec le masque, et pour le mettre à zéro, on fait un AND avec le masque.
Par exemple, voici deux fonctions qui proviennent d'un programme de décompression de fichiers :
/* ======================================================= */
static unsigned long readBitFromStream(size_t *bitpointer,
const unsigned char* bitstream)
{
// *bitpointer is a pointer on bits in bitstream.
// It is divided by 8 (shifted to the right 3 times)
// in order to have a pointer on bytes.
// A byte is extracted from bitstream.
// It is shifted 0 or 1 or ... 7 times
// It is masked in order to get only one bit.
// *bitpointer is incremented.
return (bitstream[(*bitpointer) >> 3] >> ((*bitpointer)++ & 0x7)) & 1;
}
/* ======================================================= */
static unsigned long readBitsFromStream(size_t *bitpointer,
const unsigned char* bitstream, size_t nbits)
{
unsigned long result; size_t i;
result = 0;
for (i = 0; i < nbits; i++)
result += (readBitFromStream(bitpointer, bitstream)) << i;
return result;
}
|
Message édité par olivthill le 06-05-2010 à 10:41:40