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 :

[Débutant] signification de "(code << 1) | 0x1&qu


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2005
    Messages : 41
    Points : 16
    Points
    16
    Par défaut [Débutant] signification de "(code << 1) | 0x1&qu
    Bonjour à tous,

    voilà, je suis en train d'essayer de comprendre un programme et il y a une ligne que je ne comprends pas:

    sachant que code est de type int,

    je voulais savoir la conséquence de cette ligne d'instruction :

    (code << 1) | 0x1

    Merci d'avance pour vos explications !

    En fait la variable code devrait contenir un nombre binaire. J'ai donc supposé que << faisait un décalage.

    Merci pr vos lumières car j'en ai grandement besoin

  2. #2
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    est un int, décale code de 1, donc le multiplie par 2.
    le | est un ou, et tu testes par conséquent le bit de poids le plus faible (0x01==1), le ou a pour table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    0 0 0
    0 1 1
    1 0 1
    1 1 1
    Voila.

  3. #3
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Salut
    code << 1 correspond à un décalage des bits vers la gauche, donc à une multiplication par 2.
    le | 0x1 veut dire qu'on fait un Ou bit à bit, c'est à dire qu'on force le bit le plus à droite à 1, c-a-d dans ce cas on ajoute 1.
    si code = 12, (code << 1) | 0x1 vaut 25.

  4. #4
    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 Trap D
    code << 1 correspond à un décalage des bits vers la gauche, donc à une multiplication par 2.
    le | 0x1 veut dire qu'on fait un Ou bit à bit, c'est à dire qu'on force le bit le plus à droite à 1, c-a-d dans ce cas on ajoute 1.
    si code = 12, (code << 1) | 0x1 vaut 25.
    Tu fais une interprétation artithmétique juste, mais qui n'a peut être rien à voir avec la réalité.

    Tout ce qu'on peut dire de, c'est que la valeur de code est décalée de 1 bit vers la gauche et que le bit 0 est forcé à 1.

  5. #5
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2005
    Messages : 41
    Points : 16
    Points
    16
    Par défaut
    je vous remercie pour ces explications très claires. Je vais voir si cela coincide avec le raisonnement que j'ai fait du programme. Je peux vous en dire quelques mots : il s'agit en fait d'arbre de Huffman que je parcoure. C'est à dire que chaque noeud est un nombre (représentant le nb d'occurence d'un caractère dans un fichier texte). De plus, les feuilles de cet arbre ont en plus de ce nb d'occurences, le caractère en question. Donc, en fait, je parcours l'arbre de la racine jusqu'au feuille, et de droite à gauche. Quand je vais à droite, je mets un 1 dans la variable code, et un 0 quand je vais à gauche. Ainsi quand j'arrive aux feuilles, le caractère est relié à un code binaire. Sur internet, j'ai trouvé une fonction qui réalise cela mais je ne suis pas sur de bien la comprendre, pouvez vous me l'expliqué brièvement ? surtout la ligne que j'ai déjà évoqué précédemment !

    Voici la fonction :

    //La fonction placera dans un tableau de 512 entrées le code de chaque caractère a la position correspondant au code ascii index longu = index code + 256
    //Parcours de droite a gauche, a chaque fois que l'arbre est feuille on rempli le tableau
    //La fonction doit etre apelée avec mem = 0 et lon = 0.
    void parcours_arbre(int *tab_code,int mem,int lon,arbre A)
    {
    if(est_vide(A))
    {
    //On place dans le tableau tab_code(2 ligne, 256 col) le code ainsi que sa longueur
    tab_code[A->lettre] = mem;
    tab_code[A->lettre + 256] = lon;
    }
    else
    {
    if(A->gauche)
    parcours_arbre(tab_code,mem << 1,lon + 1,A->gauche);

    if(A->droit)
    parcours_arbre(tab_code,(mem << 1) | 0x1,lon + 1,A->droit);
    }

    }


    Merci de votre aide

  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 Re: [Débutant] signification de "(code << 1) | 0x
    Citation Envoyé par Lord Van
    sachant que code est de type int, je voulais savoir la conséquence de cette ligne d'instruction :
    Il n'y a aucun mystère, il suffit d'ouvrir son livre de C au chapitre 'opérateurs binaires' (bitwise operators).
    1. code << 1 : la valeur de code est décalée de 1 bit vers la gauche.
    2. Par conséquend, le bit 0 (LSB) passe à 0.
    3. xxx | 0x1 : le bit 0 est forcé à 1 par l'opérateur OU (|).

    En fait la variable code devrait contenir un nombre binaire.
    Une variable contient toujours un nombre binaire, vu que c'est la représentation interne éxigée par le langage C et les machines courantes.

  7. #7
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Tu fais une interprétation artithmétique juste, mais qui n'a peut être rien à voir avec la réalité.

    Tout ce qu'on peut dire de, c'est que la valeur de code est décalée de 1 bit vers la gauche et que le bit 0 est forcé à 1.
    code étant un int, dixit Lord Van, je ne vois pas ce que tu veux dire, la réalité est cellei que j'ai décrite il me semble, son interprétation c'est autre chose.

  8. #8
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2005
    Messages : 41
    Points : 16
    Points
    16
    Par défaut
    je me suis sans doute mal exprimé, code est un nombre binaire uniquement, ce n'est pas un entier !

    Merci de m'expliquer la fonction écrite préalablement car elle utilise ces instructions logiques mais je ne suis pas sur de leurs conséquences réelles.

  9. #9
    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 Trap D
    Citation Envoyé par Emmanuel Delahaye
    Tu fais une interprétation artithmétique juste, mais qui n'a peut être rien à voir avec la réalité.

    Tout ce qu'on peut dire de, c'est que la valeur de code est décalée de 1 bit vers la gauche et que le bit 0 est forcé à 1.
    code étant un int, dixit Lord Van, je ne vois pas ce que tu veux dire, la réalité est cellei que j'ai décrite il me semble, son interprétation c'est autre chose.
    Tu as parlé de multiplication par 2, d'addition... C'est de l'interprétation. Les faits c'est le décalage, le OU etc.

    Ca peut implémenter un calcul ou tout autre chose. On a pas d'indications pour en dire plus.

  10. #10
    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 Lord Van
    je me suis sans doute mal exprimé, code est un nombre binaire uniquement, ce n'est pas un entier !
    Je répète : la représentation interne de n'importe qulle valeur (entier, flottant, adresse, caractère...) est un nombre binaire.

  11. #11
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Mouais, je ne suis pas convaincu, car à part le cas du débordement le fait de décaler d'un bit sur la gauche, correspond à une multiplication par 2.
    Maintenant on peut faire un décalage sur la gauche pour une autre raison, il n'en reste pas moins que le nombre est doublé.

  12. #12
    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 Lord Van
    Merci de m'expliquer la fonction écrite préalablement car elle utilise ces instructions logiques mais je ne suis pas sur de leurs conséquences réelles.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if(A->gauche) 
     parcours_arbre(tab_code,mem << 1,lon + 1,A->gauche);
     
    if(A->droit)
    parcours_arbre(tab_code,(mem << 1) | 0x1,lon + 1,A->droit);
    Visiblement, une certaine valeur (mem) est stockée dans les bits x à 1, et en bit 0 on met 0 ou 1 selon que c'est une feuille droite ou gauche.

    La valeur passée à parcours_arbre() en 2ème paramètre a la structure suivante (supposons 16 bits)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    |<-bit 15 à 1 ->|<--- bit 0--->|
    |mem 14...mem 0 | droite/gauche|
    Note pour Trap : c'est une structure binaire, et pas du tout le résultat d'un opération arithmétique.

  13. #13
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    J'ai bien compris ce que tu voulais dire, mais ce que tu prends pour interprétation est pour moi un fait et Lycée de Versaille

  14. #14
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2005
    Messages : 41
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par Lord Van
    Merci de m'expliquer la fonction écrite préalablement car elle utilise ces instructions logiques mais je ne suis pas sur de leurs conséquences réelles.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if(A->gauche) 
     parcours_arbre(tab_code,mem << 1,lon + 1,A->gauche);
     
    if(A->droit)
    parcours_arbre(tab_code,(mem << 1) | 0x1,lon + 1,A->droit);
    Visiblement, une certaine valeur (mem) est stockée dans les bits x à 1, et en bit 0 on met 0 ou 1 selon que c'est une feuille droite ou gauche.

    La valeur passée à parcours_arbre() en 2ème paramètre a la structure suivante (supposons 16 bits)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    |<-bit 15 à 1 ->|<--- bit 0--->|
    |mem 14...mem 0 | droite/gauche|
    Note pour Trap : c'est une structure binaire, et pas du tout le résultat d'un opération arithmétique.
    que voulez vous dire par x à 1, que représente x ?

  15. #15
    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 Trap D
    J'ai bien compris ce que tu voulais dire, mais ce que tu prends pour interprétation est pour moi un fait et Lycée de Versaille
    Tu n'as pas fait assez d'assembleur (ou de logique câblée) mon fils.

    Les opérations de bases sont binaires :

    NOT, AND, OR, XOR SHL, SHR et c'est tout.

    Intreprétées d'une certaine façon ces opération permettent de réaliser des opérations arithmétiques de plus en plus complexes. Mais tout est basé sur ces opérateurs simples.

    En informatique industrielle, on apprend à câbler une ALU simplifiée (+, - X) mais avec retenue, ça calme !

  16. #16
    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 Lord Van
    que voulez vous dire par x à 1, que représente x ?
    15 si la largeur de l'objet est de 16 bits (bits 15 à 0)

  17. #17
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Tu n'as pas fait assez d'assembleur (ou de logique câblée) mon fils.

    Les opérations de bases sont binaires :

    NOT, AND, OR, XOR SHL, SHR et c'est tout.

    Intreprétées d'une certaine façon ces opération permettent de réaliser des opérations arithmétiques de plus en plus complexes. Mais tout est basé sur ces opérateurs simples.
    Je n'en ai même jamais fait mon père.
    Je crois avoir compris ton propos, mais il n'en reste pas moins qu'au niveau du résultat, en C, sur un entier, à part les cas de débordements, (ouf) le décalage d'un bit sur la gauche entraîne une multiplication par 2, oui ou non ?

  18. #18
    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 Trap D
    Je crois avoir compris ton propos, mais il n'en reste pas moins qu'au niveau du résultat, en C, sur un entier, à part les cas de débordements, (ouf) le décalage d'un bit sur la gauche entraîne une multiplication par 2, oui ou non ?
    Oui, c'est une conséquence, mais ce n'est pas forcément le but recherché. La vision purement mathématique (disons plutôt arithmétique) d'un problème risque de masquer d'autres aspects plus simples.

    Ici, par exemple, le but n'était ni de faire une multiplication par 2, ni d'ajouter 1, mais de placer une valeur dans les bits 15 (ou 31 etc. selon l'implémentation) à 1, et un flag (droite/gauche) dans le bit 0.

    Si je dois fabriquer un masque qui doit tester le bit 5, je vais tout simplement écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned bit5 = 1u << 5;
    parce que c'est simple clair et évident quand on connait les opérateurs binaires (de plus, c'est une expression constante...).

    Un matheux sera capable d'aller chercher une fonction d'exponentionation par 2 genre
    EDITED
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned bit5 = pow(2,5);
    ce qui est bien sûr une anerie de réalisation, bien mathématiquement juste... (enfin, je crois, les maths, c'est pas mon fort).

  19. #19
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Un matheux sera capable d'aller chercher une fonction d'exponentionation par 2 genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned bit5 = exp(2,5);
    ce qui est bien sûr une anerie de réalisation, bien mathématiquement juste... (enfin, je crois, les maths, c'est pas mon fort).
    Je suppose que tu veux parler de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned bit5 = pow(2,5);
    parce que je ne connais que exp avec ce prototype:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double  exp ( double x );
    (bien que la solution matheuse entraînera un problème de typage)

    Jc

  20. #20
    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 fearyourself
    Je suppose que tu veux parler de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned bit5 = pow(2,5);
    Oui ! Je n'utilise que très rarement les fonctions mathématiques...

    Corrigé. Merci.

Discussions similaires

  1. Réponses: 8
    Dernier message: 13/05/2011, 13h47
  2. [débutant] Pb adaptation de code VBA
    Par delphineleclerc1 dans le forum Access
    Réponses: 9
    Dernier message: 28/02/2006, 12h58
  3. [débutant]Raccourcis - complétion de code
    Par Kcirtap dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 03/02/2006, 11h02
  4. [xml][débutante] Quel éditeur de code xml me conseillez vous
    Par mouna201 dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 23/01/2006, 18h07
  5. [débutante] conflit entre 2 codes javascript ??
    Par silversky dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 18/09/2005, 00h42

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