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 :

Trouver rapidement l'opposé d'un nombre


Sujet :

C++

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2011
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Août 2011
    Messages : 88
    Points : 65
    Points
    65
    Par défaut Trouver rapidement l'opposé d'un nombre
    Bonjour à tous et toutes,

    Je me demandais quelle était la manière la plus rapide (quel que soit l'ordre de grandeur du temps) d'obtenir l'opposé d'un nombre.

    3 choix s'offrent à moi :

    • nbr = -nbr
    • nbr *= -1
    • nbr -= 2 * nbr


    Qu'en pensez-vous ?

  2. #2
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 963
    Points
    32 963
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    et utiliser un mask pour juste inverser le bit de signe ?
    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.

  3. #3
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Bonjour,

    Si nbr est un int :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    nbr -= 2 * nbr;
    neg eax
    (Visual 2010 release)

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2011
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Août 2011
    Messages : 88
    Points : 65
    Points
    65
    Par défaut
    D'après ce que j'ai lu, au moins les deux premières seraient optimisées de la même façon avec un flip du bit de signe par gcc.

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    Par défaut
    Les entiers en C/C++ sont en code complément à deux, non ? Si oui l'inversion d'un nombre demande plus que l'inversion d'un bit.

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    Salut
    Citation Envoyé par cob59 Voir le message
    Les entiers en C/C++ sont en code complément à deux, non ? Si oui l'inversion d'un nombre demande plus que l'inversion d'un bit.
    A peine plus : une inversion de tous les bit et l'ajout de 1...

    Mais il n'est pas du tout impossible que c'est ce que fait neg eax
    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

  7. #7
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Citation Envoyé par koala01 Voir le message
    SalutA peine plus : une inversion de tous les bit et l'ajout de 1...

    Mais il n'est pas du tout impossible que c'est ce que fait neg eax
    C'est ce que je pensais aussi mais bizarrement nbr = ~nbr + 1; émet :
    not eax
    inc eax
    Peut être que neg est un peu plus sioux que ça ?
    En tout cas amusant de voir qu'en tentant de faire à la main le complément à deux on se retrouve à émettre deux instructions au lieu d'une seule avec l'opération naïve.

  8. #8
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 368
    Points : 23 620
    Points
    23 620
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Mais il n'est pas du tout impossible que c'est ce que fait neg eax
    Je confirme que c'est bien le cas. :-)

    Citation Envoyé par Arzar Voir le message
    C'est ce que je pensais aussi mais bizarrement nbr = ~nbr + 1; émet :
    not eax
    inc eax
    Sans avoir la réponse, je dirais d'instinct que le compilateur doit appliquer un « simplificateur réducteur » d'équations aux expressions évaluables mais qui doit considérer que « ~ » n'est pas une opération « arithmétique » ordinaire. Il doit probablement la traiter comme une fonction, puis appliquer les calculs nécessaires au résultat.

    Ça vaudrait le coup de le vérifier, pour la science.

Discussions similaires

  1. Réponses: 13
    Dernier message: 25/04/2012, 18h04
  2. Réponses: 10
    Dernier message: 21/03/2010, 22h41
  3. Trouver rapidement les zéros d'une fonction
    Par nahouto dans le forum MATLAB
    Réponses: 17
    Dernier message: 23/01/2009, 13h32
  4. trouver une date à partir d'un nombre de jours
    Par charlene44 dans le forum Delphi
    Réponses: 4
    Dernier message: 21/08/2006, 14h27
  5. [Access] Trouver qui a le plus grand nombre de visites
    Par maxidoh dans le forum Langage SQL
    Réponses: 13
    Dernier message: 03/04/2006, 03h00

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