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 :

Signification de & 0x0ff


Sujet :

C++

  1. #1
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2011
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2011
    Messages : 49
    Par défaut Signification de & 0x0ff
    Bonjour,

    Pour ceux qui ont lu mon dernier post je suis toujours en train d'essayer de comprendre un programme de décodage de data...
    Mais je n'arrive pas à bien comprendre un passage.
    il s'agit de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    d = static_cast<unsigned char>(a_b & 0x0ff);
                a_b >>= 8;
    En fait je ne comprends pas bien ce que l'on fait...car je ne sais pas à quoi correspond & 0x0ff... J'ai cherché dans plusieurs forums et j'ai cru comprendre que c'était une histoire de bits et de signe... mais je comprends pas bien dans quel sens... J'ai l'impression que l'on modifie le signe de a_b pour l'enregistrer dans d, puis qu'on décale de 8 bits vers la droite a_b... Est-ce bien cela ?
    Merci de votre aide.

    Magicsmacks

  2. #2
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2011
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 366
    Par défaut
    Citation Envoyé par magicsmacks Voir le message
    J'ai l'impression que l'on modifie le signe de a_b pour l'enregistrer dans d, puis qu'on décale de 8 bits vers la droite a_b... Est-ce bien cela ?
    Merci de votre aide.

    Magicsmacks
    En un mot, oui.

    En fait, 0x0ff c'est le mot binaire: 000011111111, donc un mot & 0x0ff c'est dire, tu me gardes les 8 bits les plus à droite, et tu passes ceux de gauche à 0.

  3. #3
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2011
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2011
    Messages : 49
    Par défaut
    Merci pour cette réponse claire...
    Juste par curiosité 0x0ff ca vient d'où ?
    En fait c'est pour savoir comment le modifier si je veux garder plus ou moins de bit...
    Car j'ai aussi rencontré le code 0xaa... qu'est ce que c'est comme codage ?
    Merci

    Magicsmacks

  4. #4
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2011
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 366
    Par défaut
    Citation Envoyé par magicsmacks Voir le message
    Car j'ai aussi rencontré le code 0xaa... qu'est ce que c'est comme codage ?
    Merci

    Magicsmacks
    Alors, en fait, ta mémoire est constituée de mots mémoire, qui sont une série de 0 et de 1. Tu peux les représenter en hexadécimal, c'est à dire en base 16. Tu trouveras plus d'infos sur le net. On précise qu'on utilise le codage hexadécimal pour un nombre en le préfixant par 0x. Par exemple 0x8, c'est 8 en hexadécimal. Comme on est en base 16, il te faut plus de "chiffres", et on prend:
    • a pour 10
    • b pour 11
    • ...
    • e pour 14
    • f pour 15

    Donc 0xf est 15 en base 10.

  5. #5
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Salut,

    Pour comprendre ce 0xff, il faut comprendre le fonctionnement des différentes bases dans lesquelles il est possible de compter...
    • La base 2 (le binaire) fournit 2 symboles pour représenter les chiffres : 0 et 1
    • la base 8 (octal), qui ne nous intéresse pas ici, fournit 8 symboles pour représenter les chiffres (de 0 à 7 inclus)
    • la base 10 (décimal) est celle que l'on utilise dans "la vie de tous les jours" avec les chiffres compris entre 0 et 9
    • La base 16 fournit 16 symboles pour représenter les valeurs : les chiffres de 0 à 9 plus les lettres A(qui vaut 10), B(qui vaut 11), C(qui vaut 12), D(qui vaut 13), E(qui vaut 14), et F(qui vaut 15)
    Le principe pour compter dans les différentes bases est toujours le même:
    avec tous les "chiffres" à 0, on incrémente le chiffre qui se trouve "le plus à droite" (celui qui correspond aux unité en base dix), jusqu'à ce qu'on ai parcouru tous les symboles possibles.

    Si on doit représenter une valeur plus élevée que le dernier symbole disponible (1 en binaire, 9 en base dix, F en hexadécimal), on incrémente le symbole qui se trouve directement à gauche, et on recommence à compter, sur le premier chiffre, à partir de 0.

    Evidemment, on va faire de même pour tous les chiffres que l'on veut incrémenter, et c'est pour cela que, après 9999 en décimal, on obtient... 10000

    On peut généraliser cela en disant que "pour tout N correspondant à la position d'un symbole de droite à gauche, (en commençant à compter à 0), la valeur du symbole se trouvant à la position N correspond à la valeur du symbole multiplié par le nombre de symbole de la base élevé à l'exposant N".

    Ainsi, si tu as la valeur (décimale) de 4321, tu as:
    • 1 à la position 0 qui vaut (10^0) * 1 soit 1 (pour rappel, N exposant 0 = 1 )
    • 2 à la position 1 qui vaut (10^1) * 2 soit 20
    • 3 à la position 2 qui vaut (10^2) * 3 soit 300
    • 4 à la position 3 qui vaut (10^3) * 4 soit 4000
    et tu constateras avec bonheur que 4000 + 300 + 20 + 1 font bien... 4321

    Le principe sera exactement le même pour les bases binaire et hexadécimale, si ce n'est que, au lieu d'avoir 10^N, nous aurons respectivement 2^N (je l'ai dit plus haut, il n'y a que deux symboles disponible en base 2 ) en binaire et 16^N en hexadécimal.

    Le fait est que, au plus profond de l'ordinateur, tout se réduit à du binaire: un ordinateur peut, schématiquement parlant, se résumer à un très grand nombre d'interrupteurs connectés entre eux et chaque interrupteur peut laisser passer le courent (on l'indique par 1), ou non (on l'indique par ... 0).

    Pour ce qui est de la représentation des données, on ne va pas parler d'interrupteurs, mais de bits.

    Evidemment, comme il est un peu court de se contenter de deux valeurs, on a regroupé les bits pour faire des bytes.

    A l'heure actuelle, on peut considérer que les bytes sont, plus ou moins globalement, composés de 8 bits.

    Mais il faut avouer que le fait d'évaluer une valeur est d'autant plus compliqué que le nombre de symboles nécessaires pour la représenter est important.

    Ce n'est pas pour rien que l'on écrira souvent la valeur 87654321 sous la forme de 87 654 321

    Et donc, si donc on a une valeur binaire de l'ordre 1010101010010101, on va très facilement se perdre dans le nombre de symboles qu'il faut afficher pour représenter cette valeur.

    Et c'est à ce niveau que la notion d'hexadécimal va intervenir.

    Il est en effet remarquable que, si tu prend un ensemble de bits 4 à 4, chaque groupe de 4 bits permet de représenter... 16 valeurs (comprises entre 0 et 15 inclus) car 2^3 + 2^2 + 2^1 + 2^0 = ... 15

    Si donc, on sépare la valeur 1010101010010101 en groupe de 4 bits, on obtiens 1010 1010 1001 0101 et chaque groupe de 4 bits est représentable par un seul symbole hexadécimal, respectivement A A 9 et 5.

    On peut donc dire sans se tromper que la valeur binaire 1010101010010101 correspond à la valeur hexadécimale (0x) AA95.

    Bien sur, il faudra sans doute convertir cela en décimal si tu veux savoir combien cela fait exactement, mais:
    1. l'ordinateur converti cela très facilement pour toi
    2. tu risques beaucoup moins d'avoir les yeux qui s'entortillent en lisant la valeur (hexadécimale)0xAA95 qu'en lisant la valeur (binaire)01010101010010101
    Le reste, bah, ce n'est plus qu'une question d'habitude.

    En effet, on écrira généralement nos valeur en base 10 dans nos programmes, sauf si l'on souhaite travailler avec ce que l'on appel un "masque de bit".

    A ce moment là, nous n'avons plus qu'un table finalement simple à retenir qui ressemble à
    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
    decimal | hexa | binaire |
        0   |   0  |  0000   |
        1   |   1  |  0001   |
        2   |   2  |  0010   |
        3   |   3  |  0011   |
        4   |   4  |  0100   |
        5   |   5  |  0101   |
        6   |   6  |  0110   |
        7   |   7  |  0111   |
        8   |   8  |  1000   |
        9   |   9  |  1001   |
       10   |   A  |  1010   |
       11   |   B  |  1011   |
       12   |   C  |  1100   |
       13   |   D  |  1101   |
       14   |   E  |  1110   |
       15   |   F  |  1111   |
    dont les valeurs que l'on utilisera le plus souvent pour les masque de bits seront sans doute 0(0x0 / 0000), 7 (0x7 / 0111), 8 (0x8 / 1000) et 15 (F /1111)

    Ainsi, quand tu verra un masque de bits de l'ordre de 0xFF, tu sauras que cela correspond à 1111 1111 en binaire et, mais tu t'y habitueras à cela aussi, comme tu sais que 8 bits permettent de représenter les valeurs comprises entre 0 et 255 inclus, tu sauras que cela fait un byte dont tous les bits sont à 1, ce qui correspond à une valeur de 255 (en base 10)

    Pour le reste, il faut savoir que l'opérateur & (à ne pas confondre avec l'opérateur && ) est un opérateur de comparaison AND "bit à bit".

    Un opérateur AND va renvoyer "vrai" ( 1 ) si les deux opérandes sont vraies, et "faux" (0) si ne serait-ce qu'une est fausse, que ce soit la première ou la deuxième (ou plutôt: celle qui se trouve à sa droite ou celle qui se trouve à sa gauche).

    Mais l'opérateur & travaille "bit à bit", comme je l'ai dit, et donc, il renverra, pour chaque bit qui compose les différentes données, 1 si le bit correspondant dans la donnée de gauche vaut 1 ET QUE le bit correspondant dans la donnée de droite vaut 1 aussi...

    Et comme on vient de voir que l'un des opérande met tous les bits à 1 (ben oui, c'est 0xFF), on est sur de récupérer dans d le résultat de la conversion de a_b en char, avec tous les bits qui valaient 1 à l'origine à 1 dans d.
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2011
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2011
    Messages : 49
    Par défaut
    Merci pour cette réponse très détaillée...
    Temps qu'on parle des opérations & (dernier paragraphe)... cela m'amène à une autre question : et l'opération Exclusive OR comment est ce qu'elle procède alors en bit à bit ?
    Merci

    Magicsmacks

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 146
    Billets dans le blog
    4
    Par défaut
    Cf la table de vérité
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
          &   |   ^
    0 0   0   0   0
    1 0   0   1   1
    1 1   1   1   0
    0 1   0   1   1
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  8. #8
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2011
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2011
    Messages : 49
    Par défaut
    Comme ca c'est bien claire...
    Si je ne dis pas de bétise le Or Exclusif correspond à ^?
    Merci pour tout

    Magicsmacks

  9. #9
    Membre émérite
    Avatar de mitkl
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2010
    Messages
    364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2010
    Messages : 364
    Par défaut
    Non c'est bien ça, on l'appelle plus couramment le XOR (eXclusive OR).

  10. #10
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2011
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2011
    Messages : 49
    Par défaut
    Merci pour tout.

    Magicsmacks

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

Discussions similaires

  1. [Mots cles]Signification de transient et volatile
    Par Pill_S dans le forum Langage
    Réponses: 2
    Dernier message: 14/07/2004, 11h58
  2. Réponses: 4
    Dernier message: 22/01/2004, 08h27
  3. Recherche la signification d'expressions en C
    Par sbadecoder dans le forum C
    Réponses: 16
    Dernier message: 20/08/2003, 07h35
  4. i386, x86 signification ?
    Par Thcan dans le forum Assembleur
    Réponses: 7
    Dernier message: 04/01/2003, 21h36

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