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 :

Comment lire un char bit a bit ?


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 227
    Points : 121
    Points
    121
    Par défaut Comment lire un char bit a bit ?
    Salut,

    Je souhaiterai lire un char (un caractère pas une chaine) bit à bit :
    (J'utilise un char pour coder un nombre, comme ce nombre est inférieur à 255 je n'ai pas besoin d'un int : quant on peut optimiser autant le faire)

    Exemple : char car=33;

    au lieu d'obtenir sa valeur decimale je voudrais connaitre la valeur de chaque bits pour ensuite les utiliser dans des if() exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if("1er bit de car"==1)
    printf("ok");
    else
    printf("erreur");
     
    //et ainsi de suite pour chaque bit
    il est biensur pas trés difficile de réaliser une procédure de ce genre 8) , mais je cherche une solution plus directe qui lit directement les bits.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    if(car >= 128)   {
    car=dest-128;
    /*donc bit8=1*/   }
     
    if(car >= 64)   {
    car=dest-64;
    /*donc bit7=1*/   }
     
    if(car >= 32)   {
    car=dest-32;
    /*donc bit6=1*/   }
     
    /*ainsi de suite... jusqu'a 1*/
    Merci de bien vouloir me renseigner

    PS: Je cherche un truc assez simple sinon je peut utiliser la technique ci-dessus, mais ca serait quant même plus élégant de faire autrement me semle t'il

  2. #2
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    En fait, tu peux utiliser les opérateurs bits à bits pour lire les différents bits de ton char, en fait j'ai peur de te donner un code faux alors voici la démarche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    soit c le char que l'on veut lire bit à bit.
    pour récupérer le ième bit (ie 7 6 5 4 3 2 1 0 )
     
    décaller de i bits vers la gauche.
    complémenter à 1 le nombre obtenu.
    retourner le nombre obtenu.
    En gros en C (C++) ça doit donner ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char getiemebit(char c, int i)
    {
         return ((c>>i) & 1);
    }
    Je n'ai pas vérifié le code que je viens de te donner, il faudra que tu teste, si c'est bien ça (théoriquement ça doit être ça mais je suis fatigué alors ...)

  3. #3
    Membre averti Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Points : 352
    Points
    352
    Par défaut
    Salut,

    je crois que tu peux faire quelquechose comme ceci en C++:

    imagine tu as un unisgned char (1 byte) nomme Value.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    unsigned char BitAlire = 1 << i ; //decale le 1 sur le ieme bit (8 bit pour un byte)
     
    //pour lire le ieme bit de value
    bool ValDuBit = (bool)(Value & BitAlire) ;
    mais ca reste a confirmer.

    XXiemeciel
    XXiemeciel

  4. #4
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    Bonjour,

    Dans le principe c'est ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    int main () {
    	unsigned char A = 0x0A;
    	unsigned short int B = 0;
     
    	cout << "Valeur de %d" << A << "en binaire" << endl;
    	for (int i = sizeof(A)*8; i >=0 ; i--) {
    	   B = A & (1<<i);
    	   cout <<" "<< (B==0?'0':'1');
    	}
     
        cin.ignore();
    	return EXIT_SUCCESS;
    }
    Ici pour l'affichage je part du bit le plus fort.

    Si tu souhaites partir du bit le plus faible, ça donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    int main () {
    	unsigned char A = 0x0A;
    	unsigned short int B = 0;
     
    	cout << "Valeur de %d" << A << "en binaire" << endl;
    	for (int i = 0; i <sizeof(A)*8 ; i++) {
    	   B = A & (1<<i);
    	   cout <<" "<< (B==0?'0':'1');
    	}
     
        cin.ignore();
    	return EXIT_SUCCESS;
    }
    Pour information, ce que tu manipules s'appelle un champ de bits (ou BitField).

  5. #5
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    J'ai l'impression que vous vous compliquez tous les deux la vie, si je résume vos méthodes (qui est en fait la même) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    J'ai A en binaire :
    1 0 1 0 0 1 0 1
    Je veux le i eme bit (les bits commencent à 0 à partir de la droite), vous faites ceci : (admettons que l'on veuille le 5 ème bit)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Je décale de i bit vers la gauche une unité :
    0 0 1 0 0 0 0 0
     
    Je fais un et binaire avec mon nombre :
    1 0 1 0 0 1 0 1
    0 0 1 0 0 0 0 0
    -----------------
    0 0 1 0 0 0 0 0
    A partir de là, vous avez tous les deux un nombre binaire, pas le i eme bit. Et donc avec un test, on obtient le bit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    0 0 1 0 0 0 0 0 > 0 0 0 0 0 0 0 0
    vrai alors on a un bit à un.
    Ma méthode est un peu différente, je vous l'explique :

    Je veux le ième bit (toujours le 5 eme), je décalle de 5 vers la droite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    1 0 1 0 0 1 0 1
     
    On décalle vers la droite :
    0 0 0 0 0 1 0 1
    Ensuite il suffit de faire un et logique avec l'unité :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    0 0 0 0 0 1 0 1
    0 0 0 0 0 0 0 1
    ----------------
    0 0 0 0 0 0 0 1
    On obtient directement le i-ème bit, pas besoin d'effectuer un test.

    (8 bit pour un byte)
    Non, pas du tout, un byte fait au moins 8 bits mais ça peut être plus. Ne pas confondre byte et octet.

  6. #6
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    Salut,

    Ta méthode est identique à la notre dans le principe.

    Il veut faire une test justement.

    Byte = octet en anglais = 8 bits, c'est immuable.

    Par contre pour un word, tout dépend du compilo (16 bits, 32 ...) et de plus, dans ce cas il faut se méfier de l'endianness.

  7. #7
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Définition wikipédia :

    A contiguous sequence of a fixed number of bits. On modern computers, an eight-bit byte or octet is by far the most common. This was not always the case. Certain older models have used six-, seven-, or nine-bit bytes - for instance on the 36-bit architecture of the PDP-10. Another example of a non eight-bit sequence is the 12-bit slab of the NCR-315
    Si je peux me permettre une citation d'une discution sur le sujet avec un expert sur le sujet :


    Non. Cette confusion est courante. En C, Un /byte/ (fr: multiplet, quel vilain mot!) est la plus petite unité adressable d'au moins 8 bits. Sur un DSP 56156 (Freescale ex-Motorola), elle fait 32 bits par ce que le bus de données fait 32 bits, et n'est pas 'sous-adressabe' en 16 ou 8 bits comme sur 386, 68k ou PowerPC. C'est une réalité que le C (langage portable) intègre dans sa définition. Il est bon de la respecter.

    Pour moi c'était clair. Il s'agit d'un problème de traduction. octet en anglais va se dire byte ...
    Non. Ca ce dit /octet/. Mais beaucoup font la confusion, ce qui ne veut pas dire que c'est une erreur.
    Si tu n'es toujours pas convaincu , encore un exemple de discution sur le sujet :

    http://lists.debian.org/debian-french/2000/05/msg00250.html

  8. #8
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    Si je suis convaincu.

    Ca a existé des bestioles comme ça! Enfin, depuis les années 90 à maintenant, je n'avais jamais vu le cas. Donc j'ai péché par manque de connaissance.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 227
    Points : 121
    Points
    121
    Par défaut
    Merci pour toute vos réponses !

    j'ai pris le code de PRom@ld qui marche trés bien !!
    Citation Envoyé par PRomu@ld
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char getiemebit(char c, int i)
    {
         return ((c>>i) & 1);
    }
    Merci encore a vous

  10. #10
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Si tu as beaucoup de manipulations de bit à faire, std::bitset encapsule un peu ça.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/02/2010, 19h19
  2. Comment lire des fichiers iso sous Windows 7 64 bits ?
    Par Battosaiii dans le forum Windows 7
    Réponses: 8
    Dernier message: 25/02/2010, 13h44
  3. Comment lire un fichier TIF 1 bit
    Par colorid dans le forum Langage
    Réponses: 2
    Dernier message: 20/12/2009, 09h09
  4. Lire bit par bit
    Par The_Undertaker dans le forum C++
    Réponses: 8
    Dernier message: 01/07/2005, 11h43
  5. Comment determiner la position d'un bit modifier?
    Par thx2003 dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 17/12/2003, 16h08

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