Sebagai contoh dalam pseudocode:
if ((a mod 2) == 0)
{
isEven = true;
}
else
{
isEven = false;
}
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
ataua%(2==0)
. Saya kira itu kurang penting di java di mana boolean tidak sama dengan bilangan bulatBerikut ini adalah representasi kode semu Anda dalam kode Java minimal;
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.
sumber
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.
Pendekatan kedua mengambil keuntungan lebih baik dari bahasa tersebut, dan mengarah pada kode yang lebih ringkas. (Jangan lupa bahwa operator == mengembalikan boolean.)
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.
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.
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.
sumber
Untuk menjalankan operasi% (REM) Java seperti MOD untuk nilai X negatif dan Y positif, Anda dapat menggunakan metode ini:
atau dengan operator ternary (lebih pendek, tetapi tidak mungkin atau kurang efisien dalam beberapa situasi):
sumber
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!
sumber
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.
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
sumber
Kode berjalan lebih cepat tanpa menggunakan modulo:
sumber
sumber
Anda harus memeriksa spesifikasi sebelum menggunakan% operator 'sisa':
http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.17.3
sumber
Di Jawa itu adalah
%
operator: 15.17.3. Operator Sisa%Perhatikan bahwa ada juga
floorMod
dijava.lang.Math
kelas yang akan memberikan hasil yang berbeda dari%
argumen dengan tanda yang berbeda:public static int floorMod​(int x, int y)
sumber
%
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 makaarray[floorMod(i, array.length)
berfungsi dengan benar bahkan jika indeksi
masuk ke wilayah negatif. Tidak demikian halnya dengan%
.Selain itu, mod dapat digunakan seperti ini:
b
akan sama dengan 1. Karena7 % 2 = 1
.sumber
Operator sisanya di Jawa adalah
%
dan operator modulo dapat dinyatakan sebagaisumber
Seperti yang telah ditunjukkan orang lain,
%
operator (sisa) tidak sama denganmod
operasi / fungsi modulus matematika .Agar memiliki metode untuk menggunakan operasi modulus matematika dan tidak peduli dengan tanda di depan
x
orang dapat menggunakan:Mungkin gambar ini membantu memahaminya dengan lebih baik (saya kesulitan membungkus kepala saya dulu)
sumber
int
variabel itu sendiri. ThefloorMod
metode tidak melakukan itu dengan benar (tetapi Anda mungkin perlu perhitungan tambahan jikan
negatif).Cara lain adalah:
Namun cara termudah masih:
Seperti yang dikatakan @Steve Kuo.
sumber
Dalam
Java
, operasi mod dapat dilakukan seperti itu:Catatan: The mod operasi berbeda dari sisa operasi. Dalam
Java
, operasi sisanya dapat dilakukan seperti:sumber
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 jugafloorMod
untuklong
nilai dan sebaliknya adaBigInteger
untuk nilai yang lebih besar.Operator modulo adalah% (tanda persen). Untuk menguji kemerataan atau secara umum melakukan modulo untuk kekuatan 2, Anda juga dapat menggunakan & (operator dan) seperti isEven =! (A & 1).
sumber
Alternatif kode dari @Cody:
Menggunakan operator modulus:
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.sumber