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.
Partager