it-swarm.it

Qual è la sintassi per mod in java

Come esempio in pseudocodice:

if ((a mod 2) == 0)
{
    isEven = true;
}
else
{
    isEven = false;
}
212
Bob

Per numeri interi non negativi, puoi usare resto operator %. Per il tuo esatto esempio:

if ((a % 2) == 0)
{
    isEven = true;
}
else
{
    isEven = false;
}

Questo può essere semplificato per un one-liner:

isEven = (a % 2) == 0;
338
Cody Hatch

Ecco la rappresentazione del tuo pseudo-codice nel minimo codice Java;

boolean isEven = a % 2 == 0;

Ora lo scomodo nei suoi componenti. L'operatore modulo in Java è il carattere percentuale (%). Quindi prendere un int% int restituisce un altro int. L'operatore double equals (==) viene utilizzato per confrontare i valori, ad esempio una coppia di ints e restituisce un valore booleano. Questo viene quindi assegnato alla variabile booleana 'isEven'. In base alla precedenza dell'operatore, il modulo verrà valutato prima del confronto.

110
martinatime

Dato che tutti gli altri hanno già dato la risposta, aggiungerò un po 'di contesto aggiuntivo. % l'operatore "modulo" sta effettivamente eseguendo l'operazione rimanente. La differenza tra mod e rem è sottile, ma importante.

(-1 mod 2) darebbe normalmente 1. Più specificatamente dati due interi, X e Y, l'operazione (X mod Y) tende a restituire un valore nell'intervallo [0, Y). Detto diversamente, il modulo di X e Y è sempre maggiore o uguale a zero e inferiore a Y.

L'esecuzione della stessa operazione con l'operatore "%" o rem mantiene il segno del valore X. Se X è negativo, ottieni un risultato nell'intervallo (-Y, 0]. Se X è positivo, ottieni un risultato nell'intervallo [0, Y). 

Spesso questa sottile distinzione non ha importanza. Tornando alla tua domanda sul codice, però, ci sono diversi modi per risolvere "equità".

Il primo approccio è buono per i principianti, perché è particolarmente dettagliato.

// Option 1: Clearest way for beginners
boolean isEven;
if ((a % 2) == 0)
{
  isEven = true
}
else
{
  isEven = false
}

Il secondo approccio sfrutta meglio il linguaggio e porta a un codice più succinto. (Non dimenticare che l'operatore == restituisce un valore booleano).

// Option 2: Clear, succinct, code
boolean isEven = ((a % 2) == 0);

Il terzo approccio è qui per completezza e utilizza l'operatore ternary . Sebbene l'operatore ternario sia spesso molto utile, in questo caso considero il secondo approccio superiore.

// Option 3: Ternary operator
boolean isEven = ((a % 2) == 0) ? true : false;

Il quarto e ultimo approccio consiste nell'utilizzare la conoscenza della rappresentazione binaria degli interi . Se il bit meno significativo è 0, allora il numero è pari. Questo può essere controllato usando l'operatore bitwise-e (&). Sebbene questo approccio sia il più veloce (si sta facendo un semplice masking dei bit invece che una divisione), è forse un po 'avanzato/complicato per un principiante.

// Option 4: Bitwise-and
boolean isEven = ((a & 1) == 0);

Qui ho usato l'operatore bitwise e l'ho rappresentato nella forma succinta mostrata nell'opzione 2. Riscrivendolo nella forma dell'opzione 1 (e in alternativa nell'opzione 3) viene lasciato come esercizio al lettore. ;)

Spero che sia d'aiuto.

88
Rob Rolnick

Per fare in modo che l'operazione% (REM) di Java funzioni come MOD per i valori X negativi e Y positivi, è possibile utilizzare questo metodo:

private int mod(int x, int y)
{
    int result = x % y;
    if (result < 0)
    {
        result += y;
    }
    return result;
}

o con l'operatore ternario (più breve, ma non possibile o meno efficiente in alcune situazioni):

private int mod(int x, int y)
{
    int result = x % y;
    return result < 0? result + y : result;
}
31
Zom-B

Mentre è possibile fare un modulo corretto controllando se il valore è negativo e correggerlo se lo è (come molti hanno suggerito), c'è una soluzione più compatta.

(a % b + b) % b

Questo eseguirà prima il modulo, limitando il valore all'intervallo -b -> + b e quindi aggiungendo b per garantire che il valore sia positivo, lasciando che il modulo successivo lo limiti all'intervallo 0 -> b.

Nota: se b è negativo, anche il risultato sarà negativo

12
Stefan T

Il codice funziona molto più velocemente senza usare il modulo:

public boolean isEven(int a){
    return ( (a & 1) == 0 );
}

public boolean isOdd(int a){
    return ( (a & 1) == 1 );
}
11
michael

Java in realtà non ha alcun operatore modulo come fa C. % in Java è un operatore resto. Su interi positivi, funziona esattamente come modulo, ma funziona in modo diverso su numeri interi negativi e, a differenza di modulo, può funzionare anche con numeri in virgola mobile. Tuttavia, è raro utilizzare% su qualsiasi cosa tranne interi positivi, quindi se vuoi chiamarlo modulo, allora sentiti libero! 

11
Greg Charles
if (a % 2 == 0) {
} else {
}
6
J D OConal

dovresti esaminare le specifiche prima di usare l'operatore 'resto'%:

http://Java.Sun.com/docs/books/jls/third_edition/html/expressions.html#15.17.3

// bad enough implementation of isEven method, for fun. so any worse?
boolean isEven(int num)
{
    num %= 10;
    if(num == 1)
       return false;
    else if(num == 0)
       return true;
    else
       return isEven(num + 2);
}
isEven = isEven(a);
4
kioto

Inoltre, mod può essere usato in questo modo:

int a = 7;
b = a % 2;

b sarebbe uguale a 1. Perché 7 % 2 = 1.

3
jjnguy

L'operatore rimanente in Java è % e l'operatore modulo può essere espresso come

public int mod(int i, int j)
{
  int rem = i % j;
  if (j < 0 && rem > 0)
  {
    return rem + j;
  }
  if (j > 0 && rem < 0)
  {
    return rem + j;
  }
  return rem;
}
3
eljenso

Un altro modo è:

boolean isEven = false;
if((a % 2) == 0)
{
    isEven = true;
}

Ma il modo più semplice è ancora: 

boolean isEven = (a % 2) == 0;

Come ha detto @Steve Kuo.

1
brothers28

L'operatore modulo è% (segno percentuale). Per verificare l'uniformità o in generale il modulo per una potenza di 2, puoi anche usare & (l'operatore e) come isEven =! (A & 1).

1
jjrv

In Java è l'operatore %: 15.17.3. Remainder Operator%

Si noti che esiste anche floorMod nella classe Java.lang.Math che fornirà un risultato diverso da % per gli argomenti con segni diversi:

public static int floorMod​(int x, int y)

0
Roland