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 :

question sur les valeurs hexadecimal


Sujet :

C

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Points : 99
    Points
    99
    Par défaut question sur les valeurs hexadecimal
    bonsoir à tous,

    j'ai vu dans plusieurs programmes des opérations comme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #define CF_NOMAIL 0x080
    #define CF_NOREG 0x100
    des definitions de variables avec une valeur hexadecimal et j'avoue que je n'ai pas bien saisi certaines choses.
    Comment sont fixées ces valeurs ? à partir de quoi on peut la définir ?

    j'ai pu trouver un peu de doc sur le opérateurs | et & pour manipuler ces valeurs mais j'ai pas bien comprit comment ca fonctionne, a quoi sert l'operateur |= ? je ne demande pas des réponses toutes faites, si vous aviez simplement une bonne documentation sur ce thème a me fournir ca me suffira largement.

    Que signifie ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int flags;
     
    flags |= CF_NOREG;
     
    flags &= ~CF_NOREG;
     
    if (!(flags & CF_NOREG))
    {
           /* code */
    }
    Je vous remercie par avance

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 692
    Points
    30 692
    Par défaut
    Salut,

    A vrai dire, une valeur hexadécimale n'est jamais qu'une valeur numérique représentée en suivant une autre convention: la base hexa au lieu de la base décimale.

    L'avantage de la base hexadécimale, c'est qu'elle permet de représenter, sur un seul symbole, exactement quatre bits.

    Ainsi, la valeur 0x100 permet représente en réalité la valeur binaire 0001 0000 0000 soit 1 * 2^9 ( 256 en base 10)

    De même, la valeur 0x080 est correspond à la valeur 0000 1000 0000 en binaire, soit 1*2^8 (128 en base 10)

    Comme tu t'en rend sans doute compte, il s'agit en réalité de valeurs représentables sur un seul bit.

    Le fait de représenter ces valeurs en hexadécimal permet, simplement de faciliter la relecture et la compréhension:

    En binaire, cela ferait tellement de "0" qu'il deviendrait difficile de les compter, et, en décimal, on remarquerait moins facilement qu'il s'agit de valeurs pour lesquelles un seul bit est à "1"

  3. #3
    Membre éclairé
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Points : 842
    Points
    842
    Par défaut
    Les valeurs, c'est le programmeur qui les fixe. Ce sont des valeurs comme des autres. L'héxadécimal n'est qu'une représentation, on aurait très bien pu déclarer ces valeurs en octal ou décimal.

    Les opérateurs & et | sont des opérateurs bitwise, c'est-à-dire qui agissent sur les bits. Les opérateurs bitwise sont :
    | = OR
    & = AND
    ^ = XOR
    ~ = inverse tous les bits
    << = Décalage à gauche de 1 bit
    >> = Décalage à droite de 1 bit

  4. #4
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Points : 99
    Points
    99
    Par défaut
    merci à vous pour vos réponses, donc ces valeurs c'est à moi de les définir, si je choisi de mettre 0x2000 ou 0x40 ca n'a aucune importance ? y a t'il tout de même une convention a respecter ?

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    donc ces valeurs c'est à moi de les définir, si je choisi de mettre 0x2000 ou 0x40 ca n'a aucune importance ?
    Ben en fonction de ce que tu veux faire, si, ça a de l'importance.
    D'après ton exemple en #1, ces valeurs permettent de créer des masques.

    Qu'est-ce que ton programme est censé faire exactement (ou, du moins, cette partie de code) ?

  6. #6
    Membre éclairé Avatar de seeme
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    430
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 430
    Points : 791
    Points
    791
    Par défaut
    L'idée c'est généralement d'utiliser des valeurs pour lesquelles un seul bit est à 1 (et un bit différent évidement, sinon c'est le même nombre).

    L'intérêt c'est de pouvoir ensuite créer des masques de bit, c'est à dire qu'on peut combiner les valeurs.

    Imagine que tu as:

    thé = 001, café = 010, chicoré = 100
    Pour représenter une personne qui prend du cawa au petit déjeuné, tu utiliseras simplement la valeur 010.

    Si tu veux représenter une personne qui boit du café ET du thé, il suffit de faire
    thé | café ( 001 | 010 = 011 )
    Tu as peut-être déjà rencontré cette méthode (configurer des sockets, initialiser un contexte SDL, OGL...)

    De même, tu as une personne, tu veux savoir si elle boit de la chicoré (le masque qui représente ce qu'elle boit est dans la variable "var"). Il suffit de faire

    si ( chicoré & var )
    alors elle boit de la chicoré (peut être autre chose aussi)
    sinon
    elle ne boit pas de chicoré
    finsi
    En effet, si var vaut disons 111 (thé et café et chicoré):

    chicoré & var <=> 100 & 111 = 100, c'est bon.
    Si var vaut 010 (uniquement du café), ça donne

    100 & 010 = 0
    Je sais pas si mon exemple est suffisamment clair..

    De mon expérience, c'est essentiellement comme ça qu'on utilisait ce genre de valeurs (programmation sur processeur ARM7 en ASM/C).

  7. #7
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Points : 99
    Points
    99
    Par défaut
    merci a vous

    jeroman, il s'agit pas d'un code que j'ai fait, ce sont uniquement des operations avec valeur hexa que j'ai trouvé dans plusieurs programme et ne comprenant pas a quoi ca pouvait bien servir j'ai pompé quelques lignes que je voulais qu'ont m'explique et voila

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define CF_NOMAIL 0x080
    CF_NOMAIL semble vouloir dire que si ce masque est à 1, on n'utilisera pas l'envoi d'email automatique, d'ailleur pourquoi ne pas avoir mit 1 tout simplement ?

    je pense avoir quand même comprit l'utilité de ce systeme, on peut declarer un entier pouvant contenir plusieurs masque ou alors j'suis encore a coté de la plaque.

    merci seeme pour tes explications, j'y voit un peu plus claire mais il va me falloir un peu de temps pour assimiler toutes ces notions de bits

  8. #8
    Membre éclairé Avatar de seeme
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    430
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 430
    Points : 791
    Points
    791
    Par défaut
    Citation Envoyé par havoc50 Voir le message
    merci a vous

    jeroman, il s'agit pas d'un code que j'ai fait, ce sont uniquement des operations avec valeur hexa que j'ai trouvé dans plusieurs programme et ne comprenant pas a quoi ca pouvait bien servir j'ai pompé quelques lignes que je voulais qu'ont m'explique et voila

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define CF_NOMAIL 0x080
    CF_NOMAIL semble vouloir dire que si ce masque est à 1, on n'utilisera pas l'envoi d'email automatique, d'ailleur pourquoi ne pas avoir mit 1 tout simplement ?
    Si tu mets 1 directement, tu ne peux plus le combiner avec d'autres valeurs aussi facilement. La chose à comprendre, c'est plus "pourquoi ne pas avoir utilisé un enum" je pense.

    Ici, ce drapeau pourra être mélangé avec plusieurs autres informations (en général ce sont des infos de configurations) et faire des tests de manière très rapides et très simple (à vérifier, mais je pense que des opérations bit à bit sont au moins aussi rapide qu'une comparaison normale, après tout, c'est ce que finis par faire le processeur..).

    je pense avoir quand même comprit l'utilité de ce systeme, on peut declarer un entier pouvant contenir plusieurs masque ou alors j'suis encore a coté de la plaque.

    merci seeme pour tes explications, j'y voit un peu plus claire mais il va me falloir un peu de temps pour assimiler toutes ces notions de bits
    C'est exactement ça. Avec une seule variable de quelques bits, on peut stocker beaucoup d'informations (booleennes, fatalement..). Un exemple courant est d'utiliser un char (1 octet en général mais peut dépendre de ton architecture..) grâce auquel tu pourras stocker 8 booléens (un booléen prend la taille d'un int (4 octets sur 32 bits) ou 1 selon les compilos). Ca peut devenir critique en embarqué.. (ici c'est moins critiques je pense).

    Je pense que tu vois le gain de place (c'est vraiment pratique pour gérer des flags, savoir s'ils sont levés ou pas, leur combinaisons..) pour la rapidité, je ne pense pas que le gain soit important (comme je le disais, une comparaison finis fatalement par une comparaison bit à bit donc bon..)

  9. #9
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 692
    Points
    30 692
    Par défaut
    Le fait est que le masque doit couvrir un nombre parfois important de valeurs différentes, pouvant être compatibles entre elles ou... complètement incompatibles.

    On défini donc toutes les valeurs qui *peuvent* être intéressantes, par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #define CF_MAILIMMEDIATE 0x01 // on envoie un mail à chaque fois
    #define CF_MAILDAY 0x02 // on envoie un mail par jour
    #define CF_MAILWEEk 0x04 // on envoie un mail par semaine
    #define CF_NOMAIL 0x08 // on envoie aucun mail
    La personne peut donc choisir de recevoir non seulement un mail à chaque fois, mais aussi (et pourquoi pas en même temps ) un mail récapitulatif journalier et un mail récapitulatif hebdomadaire.

    La seule chose, c'est que si elle décide de ne pas recevoir d'e-mail du tout, elle ne peut pas, en même temps, décider d'en recevoir un, quel que soit la période envisagée.

    Lorsque l'on va se retrouver dans une situation dans laquelle un mail devra être envoyé, on va tester le masque qui correspond:

    1. Pour le mail immédiat, on comparera le choix de la personne avec CF_MAILIMMEDIATE et avec CF_NOMAIL
    2. Pour le mail journalier, on comparera le choix de la personne avec CF_MAILDAY et CF_NOMAIL
    3. Pour le mail hebdomadaire enfin, on comparera le choix de la personne avec CF_MAILWEEK et CF_NOMAIL
    De cette manière, quelle que soit la combinaison (cohérente) choisie par l'utilisateur, il recevra exactement le e-mails auxquels il s'attend

  10. #10
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Points : 99
    Points
    99
    Par défaut
    je commence a comprendre le système

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #define CF_MAILIMMEDIATE 0x01 // on envoie un mail à chaque fois
    #define CF_MAILDAY 0x02 // on envoie un mail par jour
    #define CF_MAILWEEk 0x04 // on envoie un mail par semaine
    #define CF_NOMAIL 0x08 // on envoie aucun mail
    la valeur hexa de ces variables est défini de quelle manière ? je sais que je suis chiant avec ca mais ca reste une chose que je n'arrive toujours pas a comprendre, par exemple dans le même type de programme, je parle de programmes différent mais qui font la même chose, utilisant tout les deux le système de flag et bien lors de la définition de la valeur d'un même masque la valeur hexa n'est pas la même donc au final les mecs fixent ces valeurs suivent l'humeur du jour y a un truc de spécial ?

  11. #11
    Membre éclairé Avatar de seeme
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    430
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 430
    Points : 791
    Points
    791
    Par défaut
    C'est simple..

    1, 2, 4, 8... tu vois le lien? Ce sont des puissance de 2!

    Donc elles ne s'écriront qu'avec un seul bit à 1, à chaque fois différent.

  12. #12
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Points : 99
    Points
    99
    Par défaut
    impec, j'ai pigé encore merci a vous

  13. #13
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 692
    Points
    30 692
    Par défaut
    Nous aurions d'ailleurs pu utiliser le décalage de bits, qui est presque plus parlant (à partir du moment où l'on connait la signification de <<):

    En l'utilisant, cela transformerait le code d'exemple que j'ai donné en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #define CF_MAILIMMEDIATE 1<<0 // aucun décalage de bit : 1 * 2^0 = 1
    #define CF_MAILDAY 1<<1 // décalage de  1 bit : 1*2^1 = 2
    #define CF_MAILWEEk 1<<2 //décalage de 2 bits : 1*1^2 = 4
    #define CF_NOMAIL 1<<3 // décalage de 3 bits: 1*1^3 = 8
    Tant que l'on reste dans des valeurs "simples" (mettons jusqu'à 2^8), on peut utiliser indiféramment les différentes possibilités, mais, il est vrai que, lorsque l'on en arrive à des valeurs plus élevées (ex 2^20) il devient rapidement plus difficile de déterminer la valeur exacte "naturellement".

    Bien sur, il y a toujours les calculatrices, mais elles deviennent alors nécessaires non seulement pour l'écriture du code, mais aussi pour... la lecture

  14. #14
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Points : 99
    Points
    99
    Par défaut
    merci beaucoup pour vos précisions, vous m'avez beaucoup aidé

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

Discussions similaires

  1. Question sur les tris de Hash / Valeur
    Par KuK dans le forum Langage
    Réponses: 2
    Dernier message: 27/06/2012, 13h56
  2. Question sur les valeur min et max des types ?
    Par doommick31 dans le forum Débuter
    Réponses: 4
    Dernier message: 13/04/2010, 17h35
  3. Réponses: 2
    Dernier message: 28/03/2008, 23h28
  4. Question sur les valeurs de SrcBlock et DstBlock
    Par Sensib dans le forum MATLAB
    Réponses: 3
    Dernier message: 13/10/2006, 11h56
  5. question sur les valeurs de retour
    Par arasium dans le forum Langage
    Réponses: 10
    Dernier message: 24/07/2006, 16h47

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