Jawaban:
Alih-alih operator modulo, yang memiliki semantik yang sedikit berbeda, untuk bilangan bulat non-negatif, Anda dapat menggunakan operator sisanya%
. Untuk contoh persis Anda:
if ((a % 2) == 0)
{
isEven = true;
}
else
{
isEven = false;
}
Ini dapat disederhanakan menjadi one-liner:
isEven = (a % 2) == 0;
%
dievaluasi sebelum ==
saya mencarinya, jadi tidak jelas apakah ekspresi itu setara (a%2)==0
atau a%(2==0)
. Saya kira itu kurang penting di java di mana boolean tidak sama dengan bilangan bulat
Berikut ini 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.
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 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.
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;
}
Java sebenarnya tidak memiliki operator modulo seperti 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!
array[x mod array.length]
mengakses elemen dalam array saya daripada mencoba untuk mengindeks posisi negatif.
(x % y + y) % y
atau mulai di Jawa 8,Math.floorMod(x, y)
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
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 );
}
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);
Di Jawa itu adalah %
operator:
15.17.3. Operator Sisa%
Perhatikan bahwa ada juga floorMod
di java.lang.Math
kelas yang akan memberikan hasil yang berbeda dari %
argumen dengan tanda yang berbeda:
%
karena itu juga berfungsi dengan baik ketika argumennya negatif juga. Tidak ada jawaban lain yang benar karena mereka datang dengan penafian bahwa% tidak benar-benar modulo kecuali argumennya positif. Khususnya jika Anda ingin memetakan setiap bilangan bulat ke posisi berurutan dalam sebuah array maka array[floorMod(i, array.length)
berfungsi dengan benar bahkan jika indeks i
masuk ke wilayah negatif. Tidak demikian halnya dengan %
.
Selain itu, mod dapat digunakan seperti ini:
int a = 7;
b = a % 2;
b
akan sama dengan 1. Karena 7 % 2 = 1
.
Seperti yang telah ditunjukkan orang lain, %
operator (sisa) tidak sama dengan mod
operasi / fungsi modulus matematika
.
mod
vs.%
The
x mod n
fungsi petax
untukn
di kisaran[0,n)
.
Sedangkanx % n
Operator petax
untukn
di kisaran(-n,n)
.
Agar memiliki metode untuk menggunakan operasi modulus matematika dan tidak peduli dengan tanda di depan x
orang dapat menggunakan:
((x % n) + n) % n
Mungkin gambar ini membantu memahaminya dengan lebih baik (saya kesulitan membungkus kepala saya dulu)
int
variabel itu sendiri. The floorMod
metode tidak melakukan itu dengan benar (tetapi Anda mungkin perlu perhitungan tambahan jika n
negatif).
Dalam Java
, operasi mod dapat dilakukan seperti itu:
Math.floorMod(a, b)
Catatan:
The mod operasi berbeda dari sisa operasi. Dalam Java
, operasi sisanya dapat dilakukan seperti:
a % b
Math.floorMod()
memilikinya: 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).
Jadi tidak persis sama dengan modulus matematika. Tapi , ada cara untuk mendapatkan hasil positif, juga di Javadoc dengan metode yang sama: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
operasi berfungsi seperti yang diharapkan. Ada juga floorMod
untuk long
nilai dan sebaliknya ada BigInteger
untuk nilai yang lebih besar.
Alternatif kode dari @Cody:
Menggunakan operator modulus:
bool isEven = (a % 2) == 0;
Saya pikir ini adalah kode yang sedikit lebih baik daripada menulis if / else, karena ada sedikit duplikasi & fleksibilitas yang tidak digunakan. Memang membutuhkan sedikit lebih banyak kekuatan otak untuk memeriksanya, tetapi pemberian nama yang bagus sebagai isEven
kompensasi.