J'ai récemment écrit du code pour un projet de recherche sur lequel je travaille, où l'efficacité est très importante. J'ai envisagé d'abandonner certaines des méthodes régulières dans lesquelles je fais des choses et d'utiliser des XORs par bit à la place. Je me demande si cela fera une différence (si j'effectue cette opération plusieurs millions de fois) ou si c'est la même chose après avoir utilisé 03 dans g++.
Les deux exemples qui me viennent à l'esprit :
J'ai eu un cas où (je travaille avec des ints purement positifs) j'avais besoin de changer n en n-1 si n était impair ou n en (n+1) si n était pair. Je me suis dit que j'avais plusieurs options :
if(n%2) // or (n%2==0) and flip the order
n=n-1
else
n=n+1
ou
n=n+2*n%2-1; //This of course was silly, but was the only non-bitwise 1 line I could come up with
Enfin :
n=n^1;
Toutes les méthodes font clairement la même chose, mais mon sentiment était que la troisième serait la plus efficace.
L'exemple suivant est d'ordre plus général. Disons que je compare deux nombres entiers positifs. L'un d'entre eux sera-t-il plus performant que l'autre ? Ou la différence ne sera-t-elle pas vraiment perceptible, même si j'effectue cette opération plusieurs millions de fois :
if(n_1==n_2)
if(! (n_1 ^ n_2) )
if( n_1 ^ n_2) else \do work here
Le compilateur va-t-il simplement effectuer la même opération dans toutes ces instances ? Je suis simplement curieux de savoir s'il existe un cas où je devrais utiliser des opérations par bit et ne pas faire confiance au compilateur pour faire le travail à ma place.
Corrigé : dans l'énoncé correct du problème.