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 ?
Version imprimable
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 ? :P
Bonjour,
Si nbr est un int :
Code:
1
2 nbr = -nbr neg eax
Code:
1
2nbr *= -1; neg eax
(Visual 2010 release)Code:
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.
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.