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 :

Besoin de comprendre un code


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut Besoin de comprendre un code
    Bonjour
    je n'arrive pas à comprendre le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    template <unsigned long N>
    struct binary{
    static unsigned const value
     =binary<N/10>::value<<1 |N%10
    };
    Pas au niveau de la syntaxe, mais au niveau de l'exécution de l'instruction.
    Que fait:
    binary<N/10>::value<<1 |N%10

    Dans quel ordre cela se lit?
    Si par exemple N=139,
    N%10=9

    On décale de 1 bit binary<N/10>::value

    On fait ensuite l'addition binaire de N%10 et de binary<N/10>::value<<1.
    J'imagine que cela renvoie le nombre en décimale d'un binaire?

    merci

  2. #2
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    Bonjour.

    si on applique les priorités des opérateurs, l'expression est en clair:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (binary<(N/10)>::value<<1 )|(N%10)
    en gros, on a binary<(N/10)>*2 + (N%10)

    étant donnée que la suite des N/10 va converger vers 0, on vas parler en fonction de binary(0) que nous noterons U0 (il doit exister uns spécialisation de ta classe pour cette valeur)
    on a donc
    binary(x=[1...9])=U0*2+x
    binary(x=[10...19])=U0*4+(x-10) +2
    binary(x=[20...29])=U0*8+(x-20) +4
    ...
    binary(x!=0)=binary((x/10)*10) +x%10

    comme à mon avise binary(0)=0
    ça nous fait :
    0,1,2,3,4,...,9,2,3,4,............

    puis à partir de binary 100,
    binary(100)=binary(10)*2=4
    binary(101)=binary(10)*2+1=5
    ..
    binary(110)=binary(11)*2=6
    etc...
    on a donc un convertisseur depuis des nombres notés en binaire mais sur une base digitale vers leurs valeur réelle. pour ma part, je trouve que c'est un peu tordu, mais bon,c'est plutot bien trouvé

    bonne chance pour la suite

  3. #3
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    Je ne comprend pas pourquoi tu as mis un 8 devant U0

    binary(x=[20...29])=U0*8+(x-20) +4

    j'aurais mis 4.

  4. #4
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Ce n'est pas une addition.
    C'est un OU binaire (/bit à bit). => 12->2, 13->3, etc.

    (Je ne cache pas que l'intérêt m'échappe encore -- avec un décalage de 4, on aurait eu des plages différentes (et donc une vraie addition arithmétique obfusquée) entre le modulo et le dividende, et donc un encodage en BCD, mais là ce n'est pas le cas, on ne décale que de 1 ce qui implique un recouvrement et ... n'importe quoi au final.)
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  5. #5
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    Citation Envoyé par Luc Hermitte Voir le message
    Ce n'est pas une addition.
    C'est un OU binaire (/bit à bit). => 12->2, 13->3, etc.

    (Je ne cache pas que l'intérêt m'échappe encore -- avec un décalage de 4, on aurait eu des plages différentes (et donc une vraie addition arithmétique obfusquée) entre le modulo et le dividende, et donc un encodage en BCD, mais là ce n'est pas le cas, on ne décale que de 1 ce qui implique un recouvrement et ... n'importe quoi au final.)
    J'avoue que j'ai un peu simplifié avec cette histoire d'addition, mais en supposant U0=0 le résultat est le même:
    binary(x=[0...9])=x
    binary(10)=2 //(00|10==10)
    binary(11)=3
    binary(12)=2 //(10|10==10) //mais on s'en fiche un peu
    binary(13)=3 //mais on s'en fiche un peu
    binary(14)=6 //mais on s'en fiche un peu
    ...
    binary(100)=binary(10)<<1=4
    binary(101)=5
    binary(102)=6//mais on s'en fiche un peu
    binary(103)=7//mais on s'en fiche un peu
    ...
    binary (110)=binary(11)<<1=6
    binary (111)=7
    binary (112)=6//mais on s'en fiche un peu
    binary (113)=7//mais on s'en fiche un peu
    ...
    binary(1000)=binary(100)<<1=8

    donc ça marche.

    la fonction inverse serait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    template <unsigned long N>
    struct decbin{
    static unsigned const value
     =10*decbin<N<<1>::value + N%2 
    };
    template <>
    struct decbin<0>{
    static unsigned const value
     =0;
    };
    ou encore pour rester dans le même style obscurantiste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    template <unsigned long N>
    struct decbin{
    static unsigned const value
     =10*decbin<N<<1>::value | (N&1)
    };
    template <>
    struct decbin<0>{
    static unsigned const value
     =0;
    };
    voilà. par contre, si la spécialisation de binary en 0 n'ets pas 0, je ne vois pas ce que ça peut être

    bonne chance

  6. #6
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    Voila mon calcul:


    Si N<=9, N%10=N, donc binary(x)=2U0+x

    Si 10<=N<=19 alors N%10=N-10, et N/10 est compris entre 1 et 2, (convertir en int, cela vaut 1) donc

    binary(N)=2*binary(N/10)+N%10
    =2*binary(1)+x-10=2*(2U0+1)+x-10=4U0+2+(x-10)


    Si 20<=N<=29 alos N%20=N-20 et N/10 est compris entre 2 et 3 (convertir en int, cela vaut 2) donc

    binary(N)=2*binary(N/10)+N%10
    =2*binary(2)+(x-20)=2*(2U0+2)+x-20=4U0+4+(x-20)

    Si 30<=N<=39 alos N%10=N-30 et N/10 est compris entre 3 et 4 (converti en int, cela vaut 3) donc

    binary(N)=2*binary(N/10)+N%10
    =2*binary(3)+N-30=2*(2U0+3)+(x-30)=4U0+6+(x-30)

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

Discussions similaires

  1. Besoin d'aide pour comprendre un code
    Par belibaste34 dans le forum MATLAB
    Réponses: 0
    Dernier message: 25/04/2014, 10h01
  2. Besoin de comprendre un code
    Par deubelte dans le forum C++
    Réponses: 7
    Dernier message: 24/08/2010, 07h33
  3. [AC-2007] besoin d'aide pour comprendre un code pour FTP trouvé sur le forum
    Par tibofo dans le forum VBA Access
    Réponses: 2
    Dernier message: 25/04/2010, 20h03
  4. besoin petite explication pour comprendre ce code
    Par beta1204 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 03/06/2009, 19h47
  5. Besoin d aide pour comprendre un code
    Par litlebasic dans le forum Delphi
    Réponses: 4
    Dernier message: 22/06/2006, 13h00

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