IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

manipulation de bits


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    r0d
    r0d est d�connect�
    Membre exp�riment�

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    4 299
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 4 299
    Billets dans le blog
    2
    Par d�faut manipulation de bits
    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.

  2. #2
    Membre �prouv�
    Inscrit en
    Avril 2008
    Messages
    155
    D�tails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 155
    Par d�faut
    hello,
    moi j'aurais fait:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    void SetBit( char & c, const int pos, const bool bit = true )
    {
       c = c|mask[pos];
    }
    je vois pas ce que �a fait...

  3. #3
    r0d
    r0d est d�connect�
    Membre exp�riment�

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    4 299
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 4 299
    Billets dans le blog
    2
    Par d�faut
    Citation Envoy� par loicounet Voir le message
    hello,
    moi j'aurais fait:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    void SetBit( char & c, const int pos, const bool bit = true )
    {
       c = c|mask[pos];
    }
    je vois pas ce que �a fait...
    �a g�re le cas o� bit == false, c'est a dire qu'il faut mettre le ni�me bit � 0. En effet, c = c|mask[pos]; fonctionne si l'on doit mettre le bit � 1, mais �a ne foncitonne pas si on veut le mettre � 0.

    @medinoc: nickel

  4. #4
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Au fait: Pourquoi commences-tu par le poids fort ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    r0d
    r0d est d�connect�
    Membre exp�riment�

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    4 299
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 4 299
    Billets dans le blog
    2
    Par d�faut
    Ben je sais pas. Ca reviens au m�me non?

  6. #6
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Ben, c'est surtout inhabituel. G�n�ralement, on appelle "bit 0" le bit de poids faible...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Essaie plut�t ceci:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
     c = bit ? c|mask[pos] : c&~mask[pos];
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre Expert

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 49
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - Op�rateur de t�l�communications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par d�faut
    Citation Envoy� par r0d Voir le message
    Bonjour tout le monde,
    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.
    En une seule ligne:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    std::cout << std::bitset<std::numeric_limits<char>::digits>(my_char) << std::endl;
    Ou quelque chose comme �a (en tout cas, le code ci-dessus calcule correctement la taille en bits d'un char )

    A noter aussi les m�thodes:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
     
    // ça te rappelle pas quelque chose ?
    bitset<N>& bitset<N>::set(size_t pos, bool val = true);
    // histoire de récupérer la valeur après coup.
    unsigned long bitset<N>::to_ulong() const;
    [FAQ des forums][FAQ D�veloppement 2D, 3D et Jeux][Si vous ne savez pas ou vous en �tes...]
    Essayez d'�crire clairement (c'est � dire avec des mots fran�ais complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Caf�. C'est d�pass� tout �a.
    Et si vous �tes sages, vous aurez peut �tre vous aussi la chance de passer � la t�l�. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  9. #9
    r0d
    r0d est d�connect�
    Membre exp�riment�

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    4 299
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 4 299
    Billets dans le blog
    2
    Par d�faut
    Ben en fait, j'ai essay� avec un bitset au d�but, mais le probl�me c'est que bitset n'a pas d'iterateur. Donc pas de begin() ni end(). Et du coup je n'ai pas r�ussi � l'utiliser

  10. #10
    Membre Expert

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 49
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - Op�rateur de t�l�communications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par d�faut
    Citation Envoy� par r0d Voir le message
    Ben en fait, j'ai essay� avec un bitset au d�but, mais le probl�me c'est que bitset n'a pas d'iterateur. Donc pas de begin() ni end(). Et du coup je n'ai pas r�ussi � l'utiliser
    Oui, je me suis un peu emport�... Corrig�
    Il y a une m�thode size(), un op�rateur [], une m�thode to_string() et les op�rateurs << (ostream& ..) et >> (istream& ..), donc on devrait pouvoir s'en sortir.
    [FAQ des forums][FAQ D�veloppement 2D, 3D et Jeux][Si vous ne savez pas ou vous en �tes...]
    Essayez d'�crire clairement (c'est � dire avec des mots fran�ais complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Caf�. C'est d�pass� tout �a.
    Et si vous �tes sages, vous aurez peut �tre vous aussi la chance de passer � la t�l�. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  11. #11
    r0d
    r0d est d�connect�
    Membre exp�riment�

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    4 299
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 4 299
    Billets dans le blog
    2
    Par d�faut
    Waaaahhh ok �a y est j'ai compris!!


    trop pratique en fait cette classe bitset!!


  12. #12
    Membre chevronn� Avatar de dapounet
    Profil pro
    �tudiant
    Inscrit en
    Juillet 2007
    Messages
    469
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 469
    Par d�faut
    J'aurais fait comme �a (c'est en C par contre, je ne connais pas le C++) :
    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
    unsigned char SetBit (unsigned char c, unsigned int pos, unsigned int bit)
    {
       unsigned int t = 1 << pos;
     
       if (bit == 0)
       {
          t = ~t;
          c = c & t;
       }
       else
       {
          c = c | t;
       }
     
       return c;
    }
    Et �a utilise les indices de bits traditionnels (�a vaut mieux, tout le monde est habitu� � faire comme �a).

    Pour PrintBin() :
    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
    #include <limits.h>
    #include <stdio.h>
     
    void PrintBin (unsigned char c)
    {
       unsigned int cpt;
     
       for (cpt = 0; cpt < CHAR_BIT; ++cpt)
       {
          printf("%u", (c & (0x80 << (CHAR_BIT-8))) >> (CHAR_BIT-1) );
          c = c << 1;
       }
     
       fflush(stdout);
    }

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. manipulation de bits d'un byte
    Par orelero dans le forum Langage
    R�ponses: 6
    Dernier message: 22/08/2008, 10h41
  2. word_t et Manipulation de bits
    Par fmichael dans le forum C#
    R�ponses: 2
    Dernier message: 19/03/2007, 09h33
  3. [VS 2005] Manipuler des bits
    Par b_lob dans le forum C#
    R�ponses: 5
    Dernier message: 05/02/2007, 09h51
  4. [Ada] Manipulation de "Bits"
    Par BoBy9 dans le forum Ada
    R�ponses: 2
    Dernier message: 14/06/2006, 11h57
  5. Manipulation de bits
    Par Tsly dans le forum C++
    R�ponses: 2
    Dernier message: 28/09/2005, 12h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo