Laquelle de ces techniques est la meilleure option pour diviser un entier par 2 et pourquoi?
Technique 1:
x = x >> 1;
Technique 2:
x = x / 2;
Ici, x
est un nombre entier.
Laquelle de ces techniques est la meilleure option pour diviser un entier par 2 et pourquoi?
Technique 1:
x = x >> 1;
Technique 2:
x = x / 2;
Ici, x
est un nombre entier.
Utilisez l'opération qui décrit le mieux ce que vous essayez de faire.
Notez qu'ils ne sont pas exactement équivalents. Ils peuvent donner des résultats différents pour les entiers négatifs. Par exemple:
-5 / 2 = -2
-5 >> 1 = -3
Au tas: il y a donc beaucoup de raisons en faveur de l'aide d' x = x / 2;
Voici quelques:
il exprime votre intention plus clairement (en supposant que vous n'êtes pas affaire avec peu tourner registre bits ou quelque chose)
le compilateur va réduire cela à une opération de déplacement de toute façon
même si le compilateur n'a pas le réduire et a choisi un fonctionnement plus lent que le changement, la probabilité que cela finit par affecter votre rendement du programme de façon mesurable est lui-même extrêmement petite (et si elle ne l'affectent, de façon mesurable, alors vous avez une réelle raison d'utiliser une maj)
si la division est faire partie d'une expression plus grande, vous êtes plus susceptibles d'obtenir la priorité de droite si vous utilisez l'opérateur de division:
x = x / 2 + 5;
x = x >> 1 + 5; // not the same as above
arithmétique signée risque de compliquer encore plus les choses de la préséance problème mentionné ci-dessus
réaffirmons - le compilateur va déjà le faire pour vous de toute façon. En fait, il va convertir la division par une constante à une série de changements, ajoute, et se multiplie pour toutes les sortes de nombres, et pas seulement des puissances de deux. Voir cette question pour les liens vers encore plus d'informations à ce sujet.
En bref, vous n'achetez rien en codage à un changement quand tu veux vraiment dire, de multiplier ou de diviser, à l'exception peut-être une augmentation de la possibilité d'introduire un bug. Il a été d'une durée de vie puisque les compilateurs n'étaient pas assez intelligents pour optimiser ce genre de chose à un déplacement le cas échéant.
Laquelle est la meilleure option et pourquoi divisant le nombre entier par 2?
Dépend ce que tu entends par meilleur.
Si vous voulez que vos collègues à vous haïr, ou pour rendre votre code difficile à lire, je serais certainement aller avec la première option.
Si vous souhaitez diviser un nombre par 2, aller avec le second.
Les deux ne sont pas équivalents, ils ne se comportent pas de la même si le nombre est négatif ou à l'intérieur de plus grandes expressions - bitshift a priorité moins élevée
+
ou-
, la division a une priorité plus élevée.Vous devez écrire votre code d'exprimer ce que son intention est. Si la performance est votre problème, ne vous inquiétez pas, l'optimiseur ne un bon travail à ce genre de micro-optimisations.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.