Bonjour tout le monde,

voilà, je suis en train d'implémenter une série de fonctions pour manipuler des bits. Sur l'une d'entre elle, j'ai un gros doute. Il s'agit d'une fonction qui doit modifier un bit dans un octet. Comme paramètres, elle prend un char (nous supposerons ici qu'un char fait 8 bits), un int qui correspond à la position du bit à modifier, et un bool qui est la valeur que doit prendre le bit modifié (false->0, true->1). Or je trouve la méthode que j'utilise ne me plait pas, je suis sûr qu'on peut faire beaucoup plus simple (et rapide):

Voici ma fonction:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
// c est le char que l'on va modifier
// pos la position du bit a modifier
// bit la valeur du bit a modifier
void SetBit( char & c, const int pos, const bool bit = true )
{
   c = bit ? c|mask[pos] : ~(~c|mask[pos] );
}
 
// mask est un tableau de 8 char initialisé ainsi:
char mask[8] = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 };
Si ce post vous intéresse et que vous êtes motivé pour trouver, voici une fonction qui affiche un char sous forme binaire (de même, il est certainement possible de faire beaucoup plus simple que ce que j'ai fait):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// affiche un char sous forme binaire
// par exemple, PrintBin( 0x3E ) va afficher '00111110'
void PrintBin( const char c )
{
   for ( int i=0; i<8; i++ )
   {
      if( (int) ( c & mask[i] ) == 0 )
      {
         cout << "0";
      }
      else
      {
         cout << "1";
      }
   }
   cout << endl;
}
Voilà, donc si vous avez des idées pour améliorer ce code, ou si vous voyez des erreurs, n'hésitez pas.