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 ?
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 ?
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.
Bonjour,
Si nbr est un int :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 nbr = -nbr neg eax
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2nbr *= -1; neg eax
(Visual 2010 release)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2nbr -= 2 * nbr; neg eax
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.
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 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
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.
Je confirme que c'est bien le cas. :-)
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.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager