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 :

savoir si un nombre est pair ou non


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2003
    Messages : 315
    Points : 105
    Points
    105
    Par défaut savoir si un nombre est pair ou non
    Bonjour tout le monde, j'aimerais savoir si il existe une fonction permmettant de savoir si un chiffre est pair ou non.
    j'ai trouvé ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if(chiffre% 2 == 0) {
       // ici c'est pair
    } 
    else {
       // ici c'est impair
    }
    mais si vous pensez qu'il y a mieux, svp faites moi signe
    merci

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if( nombreEntier & 1 )
      {
      //Impair
      }
    else
      {
      //Pair
      }
    (Attention par contre, ça ne marche qu'avec des entiers, pas des flottants. De toute façon, peut-on dire d'un nombre à virgule flottante qu'il est pair ou impair ? )
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre averti
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Points : 353
    Points
    353
    Par défaut
    Il n'y a pas de fonction qui fait ça à ma connaissance.
    Ta méthode marche très bien, sinon tu as aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    bool estPair(const int i)
    {
       return ! (i&1);  //  le ET binaire entre num et 0x00000001 retourne 1 si le nombre est impair
    //   return  (i%2==0);   // la solution avec le modulo
    }
    qui est peut-être un poil plus rapide, mais honnêtement à ce niveau là ca ne change pas grand chose (si il y a bien une différence)...

    edit: bah ça m'apprendra à faire autre chose pendant que je réponds, j'arrive trop tard du coup
    And still we will be here, standing like statues ...

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Août 2003
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 247
    Points : 276
    Points
    276
    Par défaut
    Citation Envoyé par bigquick
    qui est peut-être un poil plus rapide, mais honnêtement à ce niveau là ca ne change pas grand chose
    Un compilateur n'est pas une brèle.
    Si le compilateur était effectivement une brèle, la différence serait effectivement importante (rapport d'un facteur 5, voire 10, sur x86).

  5. #5
    Membre averti
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Points : 353
    Points
    353
    Par défaut
    Désolé d'avoir froissé les amis des compilateurs
    Enfin j'ai pas compris ton point, désolé ... au final ça ne change rien, c'est ça ? Il optimise le modulo pour qu'il prenne le moins de cycle possible, étant donné que c'est modulo 2 et pas modulo 237 ? Ou c'est juste le modulo en général qui est opimisé ?
    And still we will be here, standing like statues ...

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    Un bon compilateur (même un moyen maintenant) optimise systématiquement les divisions par des constantes. Donc, oui, le modulo y'a de grande chance qu'il soit un tantinet arrangé et je pense qu'au final il ne doit pas y avoir d'écart de perf mesurable.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par VoidSeer
    il ne doit pas y avoir d'écart de perf mesurable.
    D'après moi, c'est pire que ça : que tu utilises une syntaxe ou l'autre, le résultat en code machine / assembleur sera exactement le même.

    Pour gcc :
    Algebraic simplifications
    Expressions are simplified using algebraic properties of their operators and operands. For instance, i + 1 - i is converted to 1. Other properties like associativity, commutativity, and distributivity are also used to simplify expressions.

    Constant folding
    Expressions for which all operands are constant can be evaluated at compile time and replaced with their values. For instance, the expression a = 4 + 3 - 8 can be replaced with a = -1.
    Traduction :
    Simplifications algébriques
    Les expressions sont simplifiées en utilisant les propriétés algébriques de leurs opérateurs et opérandes. Par exemple, i + 1 - i en converti en 1. D'autres propriétés comme l'associativité, la commutativité, et la distributivité sont aussi utilisées pour simplifier les expressions.

    Evaluation des constantes
    Les expressions dont toutes les opérandes sont des constantes peuvent être évaluées au moment de la compilation et remplacées par leur valeurs. Par exemple, l'expression a = 4 + 3 - 8 peut être remplacée par a = -1.

  8. #8
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    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 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Citation Envoyé par remram44
    Citation Envoyé par VoidSeer
    il ne doit pas y avoir d'écart de perf mesurable.
    D'après moi, c'est pire que ça : que tu utilises une syntaxe ou l'autre, le résultat en code machine / assembleur sera exactement le même.
    +1
    Cela fait un moment que les compilos sont censés maitriser les multiplications et divisions par des constantes. (genre *254 qui est remplacé par décalages et soustractions...)
    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...

  9. #9
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    En revanche, ça pourrait être plus intéressant le !(machin&1), non ? Pas de test, pas de saut, ...

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    À quoi sert-il de savoir qu'un nombre est pair si on n'utilise pas ce savoir? C'est à ca que sert la structure conditionnelle: à savoir ce qu'on fait s'il est pair ou non. Il y aura donc toujours un test et un saut...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Miles
    En revanche, ça pourrait être plus intéressant le !(machin&1), non ? Pas de test, pas de saut, ...
    En quoi est-ce different de machin % 2 == 0 ? A part bien sur que l'utilisation de % a un comportement garanti dans le cas des nombres negatifs (je suis d'accord, les machines en complement a un ne sont pas legion).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  12. #12
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Citation Envoyé par Médinoc
    À quoi sert-il de savoir qu'un nombre est pair si on n'utilise pas ce savoir? C'est à ca que sert la structure conditionnelle: à savoir ce qu'on fait s'il est pair ou non. Il y aura donc toujours un test et un saut...
    Non, on peut utiliser cette donnée dans d'autres opérations avec addition, genre (result * nombre) + (!result * nombre), même si ce n'est pas très propre - true a une valeur fixe valant 0xFF, non ? -

  13. #13
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Miles
    On peut utiliser cette donnée dans d'autres opérations avec addition, genre (result * nombre) + (!result * nombre), même si ce n'est pas très propre - true a une valeur fixe valant 0xFF, non ? -
    true vaut 1 et false 0.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  14. #14
    CGi
    CGi est déconnecté
    Expert éminent
    Avatar de CGi
    Inscrit en
    Mars 2002
    Messages
    1 030
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 1 030
    Points : 8 202
    Points
    8 202
    Par défaut
    D'après moi, c'est pire que ça : que tu utilises une syntaxe ou l'autre, le résultat en code machine / assembleur sera exactement le même.
    J'ai fait le test par curiosité :

    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 estpair1(int x)
    {
       return x&1;
    }
    ------------------------------	
     
    	push ebp
    	mov ebp,esp
     
    	mov eax,dword ptr [ebp+8]
    	and eax,1
     
    	pop ebp
    	ret

    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
    18
    int estpair2(int x)
    {
       return x%2;
    }	
    ------------------------------
     
    	push ebp
    	mov ebp,esp
     
    	mov eax,dword ptr [ebp+8]
    	and eax,-2147483647
    	jns short S1
    	dec eax
    	or eax,-2
    	inc eax
    S1:	
    	pop ebp
    	ret
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

  15. #15
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 670
    Points
    10 670
    Billets dans le blog
    3
    Par défaut
    Si tu remplaces "int" par "unsigned int" pour le type de x, tu devrais obtenir la même chose.

  16. #16
    CGi
    CGi est déconnecté
    Expert éminent
    Avatar de CGi
    Inscrit en
    Mars 2002
    Messages
    1 030
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 1 030
    Points : 8 202
    Points
    8 202
    Par défaut
    Si tu remplaces "int" par "unsigned int" pour le type de x, tu devrais obtenir la même chose.
    Affirmatif !



    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 nbpair1(unsigned int x)
    {
       return x&1;
    }
    ------------------------------	
     
    	push ebp
    	mov ebp,esp
     
    	mov eax,dword ptr [ebp+8]
    	and eax,1
     
    	pop ebp
    	ret
    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 nbpair2(unsigned int x)
    {
       return x%2;
    }	
    ------------------------------
     
    	push ebp
    	mov ebp,esp
     
    	mov eax,dword ptr [ebp+8]
    	and eax,1
     
    	pop ebp
    	ret
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

  17. #17
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par CGi
    D'après moi, c'est pire que ça : que tu utilises une syntaxe ou l'autre, le résultat en code machine / assembleur sera exactement le même.
    J'ai fait le test par curiosité :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int estpair1(int x)
    {
       return x&1;
    }
     
    int estpair2(int x)
    {
       return x%2;
    }
    Tu as teste avec des parametres negatifs? Normalement -1 & 1 donne 1 tandis que -1 % 2
    donne -1. Pas trop etonnant que le code soit different. Je me demande si ton optimiseur est assez pousse pour savoir que les deux fonctions suivantes sont equivalentes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    bool estpair(int x)   { return (x&1) == 0; }
    bool estpair2(int x) { return (x%2) == 0; }
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  18. #18
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Citation Envoyé par jmarc68
    Citation Envoyé par Miles
    On peut utiliser cette donnée dans d'autres opérations avec addition, genre (result * nombre) + (!result * nombre), même si ce n'est pas très propre - true a une valeur fixe valant 0xFF, non ? -
    true vaut 1 et false 0.
    C'est encore mieux

  19. #19
    CGi
    CGi est déconnecté
    Expert éminent
    Avatar de CGi
    Inscrit en
    Mars 2002
    Messages
    1 030
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 1 030
    Points : 8 202
    Points
    8 202
    Par défaut
    Citation Envoyé par jmarc68
    Je me demande si ton optimiseur est assez pousse pour savoir que les deux fonctions suivantes sont equivalentes
    Et bien apparement non :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    bool estpair1(int x)
    {
       return (x&1) == 0;
    }
    ------------------------------	
     
    	push ebp
    	mov ebp,esp
    	test byte ptr [ebp+8],1
    	sete al
    	and eax,1
    	pop ebp
    	ret
    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
    18
    19
    20
    bool estpair2(int x)
    {
       return (x%2) == 0;
    }	
    ------------------------------
     
    	push ebp
    	mov ebp,esp
    	mov eax,dword ptr [ebp+8]
    	and eax,-2147483647
    	jns short S1
    	dec eax
    	or eax,-2
    	inc eax
    S1:	test eax,eax
    	sete al
    	and eax,1
     
    	pop ebp
    	ret
    J'ai bien testé avec différentes options d'otimisation mais ça ne change rien.
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

  20. #20
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Quelle est la condition, pour jns ? (surtout après un AND...)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. savoir si un nombre est pair ou impair?
    Par bubulle29 dans le forum MATLAB
    Réponses: 3
    Dernier message: 05/06/2009, 15h39
  2. Comment savoir si un nombre est premier ?
    Par Extra-Nitro dans le forum Général Python
    Réponses: 9
    Dernier message: 03/01/2006, 14h28
  3. VB Comment savoir si un chiffre est pair ou impair ?
    Par PRACH dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 07/09/2005, 18h02
  4. Réponses: 4
    Dernier message: 30/06/2002, 20h23

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