it-swarm-id.com

Apa sintaks untuk mod di java

Sebagai contoh dalam pseudocode:

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

Untuk bilangan bulat non-negatif, Anda dapat menggunakan sisanya operator %. Untuk contoh persis Anda:

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

Ini dapat disederhanakan menjadi one-liner:

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

Berikut adalah representasi kode semu Anda dalam kode Java minimal;

boolean isEven = a % 2 == 0;

Sekarang saya akan memecahnya menjadi komponen-komponennya. Operator modulus di Jawa adalah karakter persen (%). Oleh karena itu mengambil int% int mengembalikan int lain. Operator double equals (==) digunakan untuk membandingkan nilai, seperti sepasang int dan mengembalikan boolean. Ini kemudian ditugaskan ke variabel boolean 'isEven'. Berdasarkan prioritas operator modulus akan dievaluasi sebelum perbandingan.

110
martinatime

Karena semua orang sudah memberikan jawabannya, saya akan menambahkan sedikit konteks tambahan. % "modulus" operator sebenarnya melakukan operasi sisanya. Perbedaan antara mod dan rem halus, tetapi penting.

(-1 mod 2) biasanya akan memberikan 1. Lebih khusus diberikan dua bilangan bulat, X dan Y, operasi (X mod Y) cenderung mengembalikan nilai dalam kisaran [0, Y). Dikatakan berbeda, modulus X dan Y selalu lebih besar dari atau sama dengan nol, dan kurang dari Y.

Melakukan operasi yang sama dengan "%" atau operator rem mempertahankan tanda dari nilai X. Jika X negatif Anda mendapatkan hasil dalam rentang (-Y, 0). Jika X positif Anda mendapatkan hasil dalam kisaran [0, Y). 

Seringkali perbedaan halus ini tidak masalah. Kembali ke pertanyaan kode Anda, ada beberapa cara penyelesaian untuk "evenness".

Pendekatan pertama baik untuk pemula, karena sangat bertele-tele.

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

Pendekatan kedua mengambil keuntungan lebih baik dari bahasa tersebut, dan mengarah pada kode yang lebih ringkas. (Jangan lupa bahwa operator == mengembalikan boolean.)

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

Pendekatan ketiga di sini untuk kelengkapan, dan menggunakan operator ternary . Meskipun operator ternary sering sangat berguna, dalam hal ini saya menganggap pendekatan kedua lebih unggul.

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

Pendekatan keempat dan terakhir adalah menggunakan pengetahuan tentang representasi biner dari bilangan bulat . Jika bit paling signifikan adalah 0 maka angkanya genap. Ini dapat diperiksa menggunakan bitwise-and operator (&). Meskipun pendekatan ini adalah yang tercepat (Anda melakukan penyembunyian bit sederhana alih-alih pembagian), mungkin ini sedikit maju/rumit untuk pemula.

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

Di sini saya menggunakan bitwise-dan operator, dan mewakilinya dalam bentuk ringkas yang ditunjukkan pada opsi 2. Menulis ulang dalam bentuk Opsi 1 (dan sebagai alternatif, Opsi 3) dibiarkan sebagai latihan untuk pembaca. ;)

Semoga itu bisa membantu.

88
Rob Rolnick

Untuk menjalankan operasi% (REM) Java seperti MOD untuk nilai X negatif dan Y positif, Anda dapat menggunakan metode ini:

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

atau dengan operator ternary (lebih pendek, tetapi tidak mungkin atau kurang efisien dalam beberapa situasi):

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

Meskipun dimungkinkan untuk melakukan modulo yang tepat dengan memeriksa apakah nilainya negatif dan memperbaikinya jika itu (cara yang disarankan banyak orang), ada solusi yang lebih kompak.

(a % b + b) % b

Ini pertama-tama akan melakukan modulo, membatasi nilai ke -b -> + b dan kemudian menambahkan b untuk memastikan bahwa nilainya positif, membiarkan modulo berikutnya membatasi ke kisaran 0 -> b.

Catatan: Jika b negatif, hasilnya juga akan negatif

12
Stefan T

Kode berjalan lebih cepat tanpa menggunakan modulo:

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

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

Java sebenarnya tidak memiliki operator modulo seperti yang dilakukan C. % di Jawa adalah operator sisanya. Pada bilangan bulat positif, ia bekerja persis seperti modulo, tetapi ia bekerja secara berbeda pada bilangan bulat negatif dan, tidak seperti modulo, dapat bekerja dengan angka floating point juga. Namun, jarang menggunakan% pada apa pun kecuali bilangan bulat positif, jadi jika Anda ingin menyebutnya modulo, silakan saja! 

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

anda harus memeriksa spesifikasi sebelum menggunakan% operator 'sisa':

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

Juga, mod dapat digunakan seperti ini:

int a = 7;
b = a % 2;

b akan sama dengan 1. Karena 7 % 2 = 1.

3
jjnguy

Operator sisanya di Java adalah % dan operator modulo dapat dinyatakan sebagai

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

Cara lain adalah:

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

Namun cara termudah masih: 

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

Seperti yang dikatakan @Steve Kuo.

1
brothers28

Operator modulo adalah% (tanda persen). Untuk menguji kemerataan atau biasanya melakukan modulo untuk kekuatan 2, Anda juga dapat menggunakan & (operator dan) seperti isEven =! (A & 1).

1
jjrv

Di Jawa itu adalah operator %: 15.17.3. Operator Sisa%

Perhatikan bahwa ada juga floorMod di kelas Java.lang.Math yang akan memberikan hasil berbeda dari % untuk argumen dengan tanda yang berbeda:

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

0
Roland