Tout d'abord, il est en fait inexact de dire que
x % 2 == x & 1
Contre-exemple simple : x = -1
. Dans de nombreux langages, y compris Java, -1 % 2 == -1
. C'est-à-dire, %
n'est pas nécessairement la définition mathématique traditionnelle de modulo. Java l'appelle "opérateur de reste", par exemple.
En ce qui concerne l'optimisation par bit, seules les puissances modulo de deux peuvent être "facilement" effectuées en arithmétique par bit. D'une manière générale, seules les puissances modulo de base b peut "facilement" se faire avec la base b la représentation des nombres.
En base 10, par exemple, pour les valeurs non négatives. N
, N mod 10^k
c'est juste prendre le moins significatif k
les chiffres.
Références
8 votes
@Neil - Modulo et Binary And sont des opérations assez fondamentales, je suppose qu'elles sont à peu près les mêmes dans tout langage informatique.
1 votes
Je suis un peu fatigué de ne pas voir la langue affichée :) Mais je suppose qu'en général, s'ils ne le précisent pas, je suppose que cela signifie C++ ou C. Je me demande si c'est vraiment vrai
1 votes
Pour tous ceux qui ont du mal à comprendre, jetez un coup d'œil à stackoverflow.com/a/13784820/1414639 . Oh, et dans JS avec V8 je reçois un très légère l'amélioration des performances par l'utilisation d'opérateurs binaires.
1 votes
JamesKolpack Une opération par bit peut être effectuée BEAUCOUP plus rapidement sur un CPU qu'un modulo. En fait, une astuce d'assemblage courante pour mettre un registre à zéro consiste à le XORer avec lui-même (en raison de ce fait). De nos jours, un compilateur pourrait être capable d'optimiser un modulo d'une puissance de deux, mais je ne sais pas.