Als Beispiel im Pseudocode:
if ((a mod 2) == 0)
{
isEven = true;
}
else
{
isEven = false;
}
Anstelle des Modulo - Operator, der etwas andere Semantik hat, für nicht-negative ganze Zahlen sind , können Sie die Verwendung Rest Operator %
. Für Ihr genaues Beispiel:
if ((a % 2) == 0)
{
isEven = true;
}
else
{
isEven = false;
}
Dies kann zu einem Einzeiler vereinfacht werden:
isEven = (a % 2) == 0;
%
vorher ausgewertet wurde, bevor==
ich es nachgeschlagen habe, daher wäre unklar, ob der Ausdruck äquivalent zu(a%2)==0
oder ista%(2==0)
. Ich denke, es ist weniger wichtig in Java, wo ein Boolescher Wert nicht mit einer ganzen Zahl identisch istHier ist die Darstellung Ihres Pseudocodes in minimalem Java-Code.
Ich werde es jetzt in seine Komponenten zerlegen. Der Moduloperator in Java ist das Prozentzeichen (%). Daher gibt ein int% int ein anderes int zurück. Der Operator double equals (==) wird zum Vergleichen von Werten verwendet, z. B. eines Int-Paares, und gibt einen Booleschen Wert zurück. Dies wird dann der booleschen Variablen 'isEven' zugewiesen. Basierend auf der Priorität des Operators wird der Modul vor dem Vergleich bewertet.
quelle
Da alle anderen bereits die Antwort gegeben haben, werde ich einen zusätzlichen Kontext hinzufügen. % Der Operator "Modul" führt tatsächlich die Restoperation aus. Der Unterschied zwischen Mod und Rem ist subtil, aber wichtig.
(-1 mod 2) würde normalerweise 1 ergeben. Insbesondere bei zwei ganzen Zahlen, X und Y, gibt die Operation (X mod Y) tendenziell einen Wert im Bereich [0, Y] zurück. Anders gesagt, der Modul von X und Y ist immer größer oder gleich Null und kleiner als Y.
Wenn Sie dieselbe Operation mit dem Operator "%" oder rem ausführen, wird das Vorzeichen des X-Werts beibehalten. Wenn X negativ ist, erhalten Sie ein Ergebnis im Bereich (-Y, 0]. Wenn X positiv ist, erhalten Sie ein Ergebnis im Bereich [0, Y).
Oft spielt diese subtile Unterscheidung keine Rolle. Zurück zu Ihrer Code-Frage: Es gibt jedoch mehrere Möglichkeiten, nach "Gleichmäßigkeit" zu suchen.
Der erste Ansatz ist gut für Anfänger, weil er besonders ausführlich ist.
Der zweite Ansatz nutzt die Sprache besser aus und führt zu einem prägnanteren Code. (Vergessen Sie nicht, dass der Operator == einen Booleschen Wert zurückgibt.)
Der dritte Ansatz dient der Vollständigkeit und verwendet den ternären Operator. Obwohl der ternäre Operator oft sehr nützlich ist, halte ich in diesem Fall den zweiten Ansatz für überlegen.
Der vierte und letzte Ansatz besteht darin, das Wissen über die binäre Darstellung von ganzen Zahlen zu nutzen . Wenn das niedrigstwertige Bit 0 ist, ist die Zahl gerade. Dies kann mit dem bitweisen Operator (&) überprüft werden . Während dieser Ansatz der schnellste ist (Sie führen eine einfache Bitmaskierung anstelle einer Division durch), ist er für Anfänger möglicherweise etwas fortgeschritten / kompliziert.
Hier habe ich den bitweisen Operator und verwendet und ihn in der in Option 2 gezeigten prägnanten Form dargestellt. Das Umschreiben in Form von Option 1 (und alternativ in Option 3) bleibt dem Leser als Übung überlassen. ;)
Hoffentlich hilft das.
quelle
Mit dieser Methode können Sie die% (REM) -Operation von Java wie MOD für negative X- und positive Y-Werte verwenden:
oder mit dem ternären Operator (kürzer, aber in einigen Situationen nicht möglich oder weniger effizient):
quelle
Java hat eigentlich keinen Modulo-Operator wie C. % in Java ist ein Restoperator. Bei positiven Ganzzahlen funktioniert es genau wie Modulo, bei negativen Ganzzahlen jedoch anders und im Gegensatz zu Modulo auch bei Gleitkommazahlen. Trotzdem ist es selten,% für etwas anderes als positive ganze Zahlen zu verwenden. Wenn Sie es also als Modulo bezeichnen möchten, fühlen Sie sich frei!
quelle
array[x mod array.length]
immer auf ein Element in meinem Array zugegriffen wird, anstatt zu versuchen, negative Positionen zu indizieren.(x % y + y) % y
oder ab Java 8,Math.floorMod(x, y)
Während es möglich ist, ein korrektes Modulo zu erstellen, indem überprüft wird, ob der Wert negativ ist, und wenn dies der Fall ist (wie von vielen vorgeschlagen), gibt es eine kompaktere Lösung.
Dies führt zuerst das Modulo aus, begrenzt den Wert auf den Bereich -b -> + b und addiert dann b, um sicherzustellen, dass der Wert positiv ist, und lässt das nächste Modulo ihn auf den Bereich 0 -> b begrenzen.
Hinweis: Wenn b negativ ist, ist das Ergebnis ebenfalls negativ
quelle
Der Code läuft viel schneller ohne Modulo:
quelle
quelle
Sie sollten die Spezifikation überprüfen, bevor Sie den Restoperator% verwenden:
http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.17.3
quelle
In Java ist es der
%
Operator: 15.17.3. Restbetreiber%Beachten Sie, dass es auch
floorMod
in derjava.lang.Math
Klasse gibt, die ein anderes Ergebnis als%
für Argumente mit unterschiedlichen Vorzeichen liefert:public static int floorMod(int x, int y)
quelle
%
da es auch richtig funktioniert, wenn das Argument ebenfalls negativ ist. Keine der anderen Antworten ist wirklich richtig, da sie den Haftungsausschluss enthalten, dass% nicht wirklich modulo ist, es sei denn, die Argumente sind positiv. Insbesondere wenn Sie jede Ganzzahl einer aufeinanderfolgenden Position in einem Array zuordnen möchten,array[floorMod(i, array.length)
funktioniert dies auch dann ordnungsgemäß, wenn der Indexi
in den negativen Bereich wechselt. Nicht so bei%
.Mod kann auch so verwendet werden:
b
würde gleich 1 sein. Weil7 % 2 = 1
.quelle
Der Restoperator in Java ist
%
und der Modulo-Operator kann ausgedrückt werden alsquelle
Wie andere betont haben, ist der
%
(Rest-) Operator nicht derselbe wie diemod
Operation / Funktion des mathematischen Moduls.Um eine Methode zu haben, um die mathematische Moduloperation zu verwenden und sich nicht um das Vorzeichen vor
x
einem zu kümmern, kann man verwenden:Vielleicht hilft dieses Bild, es besser zu verstehen (es fiel mir schwer, mich zuerst darum zu kümmern)
quelle
int
Variablen selbst. DiefloorMod
Methode macht das richtig (aber wenn Sien
negativ sind, benötigen Sie möglicherweise zusätzliche Berechnungen ).Ein anderer Weg ist:
Aber der einfachste Weg ist immer noch:
Wie @Steve Kuo sagte.
quelle
In
Java
kann die Mod- Operation als solche ausgeführt werden:Hinweis: Die Mod- Operation unterscheidet sich von der Restoperation . In
Java
dem Rest kann den Betrieb als solche durchgeführt werden:quelle
Math.floorMod()
hat es: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).
Es ist also nicht genau das gleiche wie der mathematische Modul. Aber es gibt einen Weg, ein positives Ergebnis zuIf 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
funktioniert die Operation wie erwartet. Es gibt auchfloorMod
fürlong
Werte und ansonstenBigInteger
für größere Werte.Der Modulo-Operator ist% (Prozentzeichen). Um die Gleichmäßigkeit zu testen oder im Allgemeinen Modulo für eine Potenz von 2 auszuführen, können Sie auch & (den Operator und) wie isEven =! (A & 1) verwenden.
quelle
Eine Alternative zum Code von @Cody:
Verwenden des Moduloperators:
Ich denke, dies ist ein geringfügig besserer Code als das Schreiben von if / else, da weniger Duplizierung und ungenutzte Flexibilität vorhanden sind. Es erfordert etwas mehr Gehirnleistung, um zu untersuchen, aber die gute Benennung von
isEven
kompensiert.quelle