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 :

Manipuler des bits


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    143
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Avril 2007
    Messages : 143
    Points : 57
    Points
    57
    Par défaut Manipuler des bits
    Bonjour a vous tous, je n'arrive pas a realiser cette fonction lorsqu'on passe lettre par adresse... elle doit inverser les bits de chaque octet. Par exemple 194 : 11000010 sera transformé en un octet de valeur 67: 01000011

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void Retourne (char *lettre)
    Merci par avance de votre aide

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    Tu peux déjà poster ce que tu as fait...
    Et voici quelques petites macros dont tu pourras t'inspirer pour ton problème
    http://c.developpez.com/faq/?page=types#TYPE_acces_bit

  3. #3
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    143
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Avril 2007
    Messages : 143
    Points : 57
    Points
    57
    Par défaut
    Voila mon code qui est tres moche...

    Mais je n'arrive pas en passant par le prototype void Retourne (char *lettre) et c'est ce qui m'interesse...

    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
    18
     
    void Retourne (char lettre)
    {
     int i;
     int j = 31;
     while ((lettre&(1<<j))==0) /* elimine les 0 en trop */
           j--;
     int *T=malloc (sizeof(int)*j); 
     int t=j;
     for (i=j;i>=0;i--)
       {
        if(lettre&(1<<i)) T[t]=1;
        else T[t]=0;
        t--;
      }
     AfficheTableau (T, j+1);
     free (T);
    }

  4. #4
    Membre averti

    Profil pro
    Étudiant
    Inscrit en
    Décembre 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2004
    Messages : 499
    Points : 422
    Points
    422
    Par défaut
    salut

    je l'écrirais comme celà mais en terme de performance il y a probablement mieux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void inverser(unsigned char *cc) {
       unsigned char c = *cc;
       c = ~( (!(c&128)) | ((!(c&64))<<1) | ((!(c&32))<<2) | ((!(c&16))<<3) | ((!(c&8))<<4) | ((!(c&4))<<5) |  ((!(c&2))<<6) | ((!(c&1))<<7));
       *cc = c;
    }
     
    int main() {
        unsigned char c = 255;
        inverser(&c);
        printf("%d\n",c);
        return 0;
    }

  5. #5
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    143
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Avril 2007
    Messages : 143
    Points : 57
    Points
    57
    Par défaut
    Merci pour ton aide !!!
    Mais je dois avouer ne pas trop saisir ce que tu fais avec ces differents tests
    Si tu pouvais apporter quelques commentaires stp

    Merci encore

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par line86 Voir le message
    Bonjour a vous tous, je n'arrive pas a realiser cette fonction lorsqu'on passe lettre par adresse... elle doit inverser les bits de chaque octet. Par exemple 194 : 11000010 sera transformé en un octet de valeur 67: 01000011
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void Retourne (char *lettre)
    Ce que tu veux faire, c'est inverser l'ordre des bits, pas leur valeur. Pour ça, c'est assez simple, Il suffit de stocker la valeur et de la recopier bit à bit en utilisant les bons décalages (>>, <<).

    http://emmanuel-delahaye.developpez.com/bits.htm

    Je conseille d'utiliser des types non signés (unsigned). Pour que la fonction modifie la valeur originelle, il faut passer l'adresse de la variable via un pointeur.

    Pour simplifier le codage, travailler sur une copie locale et retourner la valeur à la fin du traitement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void Retourne (unsigned char *p_lettre)
    {
       if (p_lettre != NULL)
       {
          unsigned lettre = *p_lettre;
     
          /* traitement de 'lettre' */
     
          /* a la fin : */
          *p_lettre = lettre;
     
       }
    }

  7. #7
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par acx01b Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void inverser(unsigned char *cc) {
       unsigned char c = *cc;
       c = ~( (!(c&128)) | ((!(c&64))<<1) | ((!(c&32))<<2) | ((!(c&16))<<3) | ((!(c&8))<<4) | ((!(c&4))<<5) |  ((!(c&2))<<6) | ((!(c&1))<<7));
       *cc = c;
    }
    C'est quoi ce code ésotérique ? Tu penses pouvoir aider un débutant avec ça ?

  8. #8
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    143
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Avril 2007
    Messages : 143
    Points : 57
    Points
    57
    Par défaut
    Merci pour votre aide mais j'ai encore un probleme.
    Comment stocker les differents bits directement dans la variable bit. Car mon code donne le resultat attendu apparemment...mais c'est parce que j'ai triché, j'ai fait un printf au fur et a mesure...
    Merci encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void retourne2 (unsigned char *plettre)
    {
     int i, bit;
     int taille  = sizeof(unsigned char)*CHAR_BIT;
     unsigned char lettre = *plettre;
     for(i= 0  ; i < taille  ; i++) 
      {
       bit =((unsigned char)(lettre&(1<<i)) >> i);
       printf("%d",bit);
      }
      printf("\n");
    }

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 52
    Points : 62
    Points
    62
    Par défaut
    En suivant les conseils et les liens d'emmanuel, tu devrais comprendre facilement le code suivant.

    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
    18
    19
    20
    21
    22
     
    void InverserBitsChar(unsigned char *c)
    {
    unsigned char Entree;
    unsigned char Sortie;
    int NumBit;
     
    if(c!=NULL)
      {
      Entree=*c;
      Sortie=0;
      NumBit=0;
      while(NumBit<8)
        {
        Sortie<<=1;
        Sortie|=(Entree&1);
        Entree>>=1;
        NumBit++;
        }
      *c=Sortie;
      }
    }

  10. #10
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    143
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Avril 2007
    Messages : 143
    Points : 57
    Points
    57
    Par défaut
    Merci beaucoup pour votre aide !
    Bonne soirée

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. fonction de manipulation des bits
    Par hadiya dans le forum C++/CLI
    Réponses: 1
    Dernier message: 14/03/2014, 14h02
  2. manipulation des bits
    Par deMonHunTer dans le forum C
    Réponses: 9
    Dernier message: 12/01/2010, 22h11
  3. Manipulation des bits
    Par JLC83 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 12/01/2010, 13h33
  4. Manipulation des bits
    Par BatuBou dans le forum C
    Réponses: 17
    Dernier message: 11/01/2008, 19h24
  5. [VS 2005] Manipuler des bits
    Par b_lob dans le forum C#
    Réponses: 5
    Dernier message: 05/02/2007, 09h51

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