1. Gambaran keseluruhan
Dalam tutorial ringkas ini, kita akan menunjukkan apa itu pengendali modulo, dan bagaimana kita dapat menggunakannya dengan Java untuk beberapa kasus penggunaan umum.
2. Pengendali Modulo
Mari kita mulakan dengan kekurangan pembahagian sederhana di Jawa.
Sekiranya operasi di kedua-dua bahagian pengendali bahagian mempunyai jenis int , hasil operasi adalah int lain :
@Test public void whenIntegerDivision_thenLosesRemainder() { assertThat(11 / 4).isEqualTo(2); }
Pembahagian yang sama memberi kita hasil yang berbeza apabila sekurang-kurangnya salah satu operan mempunyai jenis float atau double:
@Test public void whenDoubleDivision_thenKeepsRemainder() { assertThat(11 / 4.0).isEqualTo(2.75); }
Kita dapat melihat bahawa kita kehilangan sisa operasi pembahagian ketika membahagi bilangan bulat.
Pengendali modulo memberi kami persis baki ini:
@Test public void whenModulo_thenReturnsRemainder() { assertThat(11 % 4).isEqualTo(3); }
Selebihnya adalah yang tinggal setelah membahagikan 11 (dividen) dengan 4 (pembahagi) - dalam kes ini, 3.
Oleh sebab yang sama pembahagian dengan sifar tidak mungkin dilakukan, tidak mungkin menggunakan operator modulo apabila argumen sebelah kanan adalah sifar.
Kedua-dua bahagian dan operasi modulo melancarkan ArithmeticException ketika kami cuba menggunakan sifar sebagai operasi sebelah kanan:
@Test(expected = ArithmeticException.class) public void whenDivisionByZero_thenArithmeticException() { double result = 1 / 0; } @Test(expected = ArithmeticException.class) public void whenModuloByZero_thenArithmeticException() { double result = 1 % 0; }
3. Kes Penggunaan Biasa
Kes penggunaan yang paling biasa bagi pengendali modulo adalah untuk mengetahui sama ada nombor yang diberikan itu ganjil atau genap.
Sekiranya hasil operasi modulo antara nombor dan dua sama dengan satu, itu adalah nombor ganjil:
@Test public void whenDivisorIsOddAndModulusIs2_thenResultIs1() { assertThat(3 % 2).isEqualTo(1); }
Sebaliknya, jika hasilnya adalah sifar (iaitu tidak ada baki), ia adalah nombor genap:
@Test public void whenDivisorIsEvenAndModulusIs2_thenResultIs0() { assertThat(4 % 2).isEqualTo(0); }
Penggunaan lain yang baik dari operasi modulo adalah untuk mengawasi indeks tempat bebas seterusnya dalam susunan bulat.
Dalam pelaksanaan sederhana antrian bulat untuk nilai int , elemen disimpan dalam susunan ukuran tetap.
Bila-bila masa kita mahu mendorong elemen ke dalam barisan bulat, kita hanya menghitung kedudukan bebas seterusnya dengan mengira modulo jumlah item yang telah kita masukkan ditambah 1 dan kapasiti barisan:
@Test public void whenItemsIsAddedToCircularQueue_thenNoArrayIndexOutOfBounds() { int QUEUE_CAPACITY= 10; int[] circularQueue = new int[QUEUE_CAPACITY]; int itemsInserted = 0; for (int value = 0; value < 1000; value++) { int writeIndex = ++itemsInserted % QUEUE_CAPACITY; circularQueue[writeIndex] = value; } }
Dengan menggunakan pengendali modulo, kami menghalang writeIndex keluar dari batas larik , oleh itu, kami tidak akan pernah mendapat ArrayIndexOutOfBoundsException .
Namun, setelah kami memasukkan lebih daripada QUEUE_CAPACITY item, item seterusnya akan menimpa yang pertama.
4. Kesimpulan
Pengendali modulo digunakan untuk menghitung baki pembahagian integer yang sebaliknya hilang.
Adalah berguna untuk melakukan perkara-perkara mudah seperti mengetahui sama ada nombor yang sama atau ganjil, serta tugas yang lebih kompleks seperti mengesan kedudukan penulisan seterusnya dalam susunan bulat.
Contoh kod boleh didapati di repositori GitHub.