De Modulo-operator in Java

1. Overzicht

In deze korte tutorial laten we zien wat de modulo-operator is en hoe we deze kunnen gebruiken met Java voor enkele veelvoorkomende gebruikssituaties.

2. De Modulo-operator

Laten we beginnen met de tekortkomingen van eenvoudige deling in Java.

Als de operanden aan beide zijden van de divisie-operator type hebben int, het resultaat van de operatie is een ander int:

@Test openbare leegte whenIntegerDivision_thenLosesRemainder () {assertThat (11/4) .isEqualTo (2); }

Dezelfde deling geeft ons een ander resultaat als ten minste een van de operanden een type heeft vlotter of dubbele:

@Test openbare leegte whenDoubleDivision_thenKeepsRemainder () {assertThat (11 / 4.0) .isEqualTo (2.75); }

We kunnen zien dat we de rest van een deeloperatie verliezen bij het delen van gehele getallen.

De modulo-operator geeft ons precies deze rest:

@Test openbare leegte whenModulo_thenReturnsRemainder () {assertThat (11% 4) .isEqualTo (3); }

De rest is wat er overblijft na het delen van 11 (het deeltal) door 4 (de deler) - in dit geval 3.

Om dezelfde reden is deling door nul niet mogelijk, is het niet mogelijk om de modulo-operator te gebruiken als het rechterargument nul is.

Zowel de divisie als de modulo-operatie gooien een ArithmeticException wanneer we nul proberen te gebruiken als de operand aan de rechterkant:

@Test (verwacht = ArithmeticException.class) public void whenDivisionByZero_thenArithmeticException () {dubbel resultaat = 1/0; } @Test (verwacht = ArithmeticException.class) public void whenModuloByZero_thenArithmeticException () {dubbel resultaat = 1% 0; }

3. Veelvoorkomende gebruiksscenario's

De meest voorkomende use-case voor de modulo-operator is om erachter te komen of een bepaald getal oneven of even is.

Als de uitkomst van de modulo-bewerking tussen een willekeurig getal en twee gelijk is aan één, is het een oneven getal:

@Test openbare leegte whenDivisorIsOddAndModulusIs2_thenResultIs1 () {assertThat (3% 2) .isEqualTo (1); }

Aan de andere kant, als het resultaat nul is (d.w.z. er is geen rest), is het een even getal:

@Test openbare leegte whenDivisorIsEvenAndModulusIs2_thenResultIs0 () {assertThat (4% 2) .isEqualTo (0); }

Een ander goed gebruik van de modulo-bewerking is om de index van de volgende vrije plek in een cirkelvormige array bij te houden.

In een simpele implementatie van een circulaire wachtrij voor int waarden, worden de elementen bewaard in een array met een vaste grootte.

Elke keer dat we een element naar onze circulaire wachtrij willen duwen, berekenen we de volgende vrije positie door de modulo te berekenen van het aantal items dat we al hebben ingevoegd plus 1 en de wachtrijcapaciteit:

@Test openbare leegte whenItemsIsAddedToCircularQueue_thenNoArrayIndexOutOfBounds () {int QUEUE_CAPACITY = 10; int [] circularQueue = nieuwe int [QUEUE_CAPACITY]; int itemsInserted = 0; voor (int waarde = 0; waarde <1000; waarde ++) {int writeIndex = ++ itemsInserted% QUEUE_CAPACITY; circularQueue [writeIndex] = waarde; }}

Met behulp van de modulo-operator voorkomen we writeIndex om buiten de grenzen van de array te vallen, zullen we daarom nooit een ArrayIndexOutOfBoundsException.

Zodra we echter meer dan invoegen QUEUE_CAPACITY items, overschrijft het volgende item de eerste.

4. Conclusie

De modulo-operator wordt gebruikt om de rest van een deling van een geheel getal te berekenen die anders verloren zou gaan.

Het is handig om eenvoudige dingen te doen, zoals uitzoeken of een bepaald getal even of oneven is, evenals complexere taken zoals het volgen van de volgende schrijfpositie in een cirkelvormige matrix.

De voorbeeldcode is beschikbaar in de GitHub-opslagplaats.


$config[zx-auto] not found$config[zx-overlay] not found