26 votes

Test de la bizarrerie d'un entier avec l'opérateur modulo

L'extrait de code suivant ne teste pas la bizarrerie correctement:

 public static boolean isOdd(int i) {
   return i % 2 == 1;
}
 

J'ai lu sur le Web que je devais le faire de la manière suivante:

 public static boolean isOdd(int i) {
   return i % 2 != 0;
}
 

Pourquoi est-ce?

34voto

Stochastically Points 4305

Peut-être parce que (i % 2) != 0 fonctionne pour les nombres positifs et négatifs

19voto

johnchen902 Points 5903

Parce que quand i est négatif -> (-1) % 2 == -1

12voto

OldCurmudgeon Points 16615

Tu devrais utiliser:

 (i & 1) != 0
 

pour éviter les problèmes de signe.

Notez également que l'utilisation de & garantit que, aussi stupide que soit le compilateur, il n'essaiera jamais d'utiliser une division pour réaliser l'opération % .

8voto

devnull Points 45016

Le premier extrait fonctionnerait correctement si l'opérateur modulo devait être remplacé par l'opérateur au niveau du bit et:

 public static boolean isOdd(int i) {
   return (i & 1) == 1;
}
 

6voto

Niels Trumpie Points 71

Cela a à voir avec la façon dont modulo fonctionne en Java. Si i est négatif, la réponse sera également négative. Chaque entrée négative retournera faux.

Prograide.com

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.

Powered by:

X