À titre d'exemple en pseudocode:
if ((a mod 2) == 0)
{
isEven = true;
}
else
{
isEven = false;
}
Au lieu de l'opérateur modulo, qui a une sémantique légèrement différente, pour les entiers non négatifs, vous pouvez utiliser l' opérateur restant%
. Pour votre exemple exact:
if ((a % 2) == 0)
{
isEven = true;
}
else
{
isEven = false;
}
Cela peut être simplifié en une seule ligne:
isEven = (a % 2) == 0;
%
était évalué avant de le==
rechercher, il serait donc difficile de savoir si l'expression est équivalente à(a%2)==0
oua%(2==0)
. Je suppose que c'est moins important en java où un booléen n'est pas le même qu'un entierVoici la représentation de votre pseudo-code en code Java minimal;
Je vais maintenant le décomposer en ses composants. L'opérateur de module en Java est le pourcentage (%). Par conséquent, prendre un int% int renvoie un autre int. L'opérateur double égal (==) est utilisé pour comparer des valeurs, telles qu'une paire d'entiers et renvoie un booléen. Ceci est ensuite affecté à la variable booléenne 'isEven'. En fonction de la priorité de l'opérateur, le module sera évalué avant la comparaison.
la source
Puisque tout le monde a déjà donné la réponse, je vais ajouter un peu de contexte supplémentaire. % l'opérateur "module" effectue actuellement l'opération restante. La différence entre mod et rem est subtile, mais importante.
(-1 mod 2) donnerait normalement 1. Plus spécifiquement, étant donné deux entiers, X et Y, l'opération (X mod Y) tend à renvoyer une valeur dans la plage [0, Y). Autrement dit, le module de X et Y est toujours supérieur ou égal à zéro, et inférieur à Y.
L'exécution de la même opération avec l'opérateur "%" ou rem conserve le signe de la valeur X. Si X est négatif, vous obtenez un résultat dans la plage (-Y, 0]. Si X est positif, vous obtenez un résultat dans la plage [0, Y).
Souvent, cette distinction subtile n'a pas d'importance. Pour en revenir à votre question de code, cependant, il existe plusieurs façons de résoudre le problème de "régularité".
La première approche est bonne pour les débutants, car elle est particulièrement verbeuse.
La deuxième approche tire mieux parti du langage et conduit à un code plus succinct. (N'oubliez pas que l'opérateur == renvoie un booléen.)
La troisième approche est ici pour l'exhaustivité et utilise l' opérateur ternaire . Bien que l'opérateur ternaire soit souvent très utile, dans ce cas, je considère la deuxième approche comme supérieure.
La quatrième et dernière approche consiste à utiliser la connaissance de la représentation binaire des nombres entiers . Si le bit le moins significatif est 0, alors le nombre est pair. Cela peut être vérifié à l'aide de l' opérateur au niveau du bit et (&). Bien que cette approche soit la plus rapide (vous faites du masquage de bits simple au lieu de la division), elle est peut-être un peu avancée / compliquée pour un débutant.
Ici, j'ai utilisé l'opérateur bit à bit et et je l'ai représenté sous la forme succincte illustrée dans l'option 2. La réécrire sous la forme de l'option 1 (et alternativement de l'option 3) est laissée au lecteur comme exercice. ;)
J'espère que cela pourra aider.
la source
Pour que l'opération% (REM) de Java fonctionne comme MOD pour les valeurs X négatives et Y positives, vous pouvez utiliser cette méthode:
ou avec l'opérateur ternaire (plus court, mais pas possible ou moins efficace dans certaines situations):
la source
Java n'a en fait pas d'opérateur modulo comme le fait C. % en Java est un opérateur restant. Sur les entiers positifs, il fonctionne exactement comme modulo, mais il fonctionne différemment sur les entiers négatifs et, contrairement à modulo, peut également fonctionner avec des nombres à virgule flottante. Pourtant, il est rare d'utiliser% sur autre chose que des entiers positifs, donc si vous voulez l'appeler un modulo, alors n'hésitez pas!
la source
array[x mod array.length]
toujours accède à un élément de mon tableau plutôt que d'essayer d'indexer les positions négatives.(x % y + y) % y
ou à partir de Java 8,Math.floorMod(x, y)
Bien qu'il soit possible de faire un modulo approprié en vérifiant si la valeur est négative et en la corrigeant si elle l'est (comme beaucoup l'ont suggéré), il existe une solution plus compacte.
Cela fera d'abord le modulo, en limitant la valeur à la plage -b -> + b, puis ajoutera b afin de garantir que la valeur est positive, laissant le modulo suivant la limiter à la plage 0 -> b.
Remarque: si b est négatif, le résultat sera également négatif
la source
Le code s'exécute beaucoup plus rapidement sans utiliser modulo:
la source
la source
vous devez examiner la spécification avant d'utiliser l'opérateur 'reste'%:
http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.17.3
la source
En Java, c'est l'
%
opérateur: 15.17.3. Opérateur restant%Notez qu'il y a aussi
floorMod
dans lajava.lang.Math
classe qui donnera un résultat différent de%
pour les arguments avec des signes différents:public static int floorMod(int x, int y)
la source
%
car il fonctionne également correctement lorsque l'argument est également négatif. Aucune des autres réponses n'est vraiment correcte car elles sont accompagnées de la clause de non-responsabilité selon laquelle% n'est pas vraiment modulo, sauf si les arguments sont positifs. En particulier, si vous souhaitez mapper chaque entier à une position consécutive dans un tableau, ilarray[floorMod(i, array.length)
fonctionne correctement même si l'indexi
passe en territoire négatif. Pas avec%
.De plus, le mod peut être utilisé comme ceci:
b
serait égal à 1. Parce que7 % 2 = 1
.la source
L'opérateur restant en Java est
%
et l'opérateur modulo peut être exprimé commela source
Comme d'autres l'ont souligné, l'
%
opérateur (restant) n'est pas le même que l'mod
opération / la fonction du module mathématique .Afin d'avoir une méthode pour utiliser l'opération de module mathématique et ne pas se soucier du signe devant
x
on peut utiliser:Peut-être que cette image aide à mieux la comprendre (j'ai eu du mal à envelopper ma tête autour de cette première)
la source
int
variable elle-même. LafloorMod
méthode le fait correctement (mais vous pouvez avoir besoin de calculs supplémentaires si ellen
est négative).Une autre façon est:
Mais le moyen le plus simple reste:
Comme l'a dit @Steve Kuo.
la source
Dans
Java
, l' opération de mod peut être effectuée comme telle:Remarque: L' opération mod est différente de l' opération restante . Dans
Java
, l' opération restante peut être effectuée comme telle:la source
Math.floorMod()
a:The floor modulus is x - (floorDiv(x, y) * y), has the same sign as the divisor y, and is in the range of -abs(y) < r < +abs(y).
Donc ce n'est pas exactement le même que le module mathématique. Mais , il existe un moyen d'obtenir un résultat positif, également dans le Javadoc de la même méthode:If the signs of arguments are unknown and a positive modulus is needed it can be computed as (floorMod(x, y) + abs(y)) % abs(y).
floorMod
opération fonctionne comme prévu. Il y a aussi les valeursfloorMod
forlong
et sinon il y aBigInteger
des valeurs plus grandes.L'opérateur modulo est% (signe pourcentage). Pour tester la régularité ou généralement modulo pour une puissance de 2, vous pouvez également utiliser & (l'opérateur et) comme isEven =! (A & 1).
la source
Une alternative au code de @Cody:
Utilisation de l'opérateur module:
Je pense que c'est un code légèrement meilleur que d'écrire if / else, car il y a moins de duplication et de flexibilité inutilisée. Cela nécessite un peu plus de puissance cérébrale à examiner, mais la bonne dénomination de
isEven
compense.la source