Met Java bitwise operators kunt u in­di­vi­du­e­le bits op elke gewenste manier ma­ni­pu­le­ren. De zeven operators zijn op dezelfde manier ge­struc­tu­reerd en volgen vaste regels die ge­mak­ke­lijk te leren zijn.

Wat zijn bitwise ope­ra­to­ren en waarvoor worden ze gebruikt?

Java-ope­ra­to­ren zijn een be­lang­rijk hulp­mid­del bij het werken met de pro­gram­meer­taal. Naast de vele andere mo­ge­lijk­he­den en functies bieden ze u de mo­ge­lijk­heid om de kleinst mogelijke in­for­ma­tie-eenheden te ma­ni­pu­le­ren: bits. Bits (binaire cijfers) hebben hun eigen ge­tal­len­stel­sel op basis van de waarden 0 en 1. Als u binaire waarden bit voor bit wilt opvragen, hebt u een bitwise operator in Java nodig. U kunt deze toepassen op de numerieke ge­ge­vens­ty­pen (byte, char, int, short, long).

Hoewel u deze functie niet dagelijks nodig zult hebben, kan deze in veel situaties nuttig zijn. Het kan bij­voor­beeld handig zijn als u ruimte wilt besparen bij het con­ver­te­ren van gegevens, als u de XOR-operator wilt gebruiken of als u gewoon een bit wilt wijzigen. Ze vormen ook de basis voor alle hogere cir­cuit­be­wer­kin­gen. Daarom is het be­lang­rijk om de ba­sis­func­ti­o­na­li­teit van Java-bitwise-ope­ra­to­ren te begrijpen.

Welke Java-bitwise-ope­ra­to­ren zijn er?

Er zijn in totaal zeven ver­schil­len­de bitwise ope­ra­to­ren in Java. Om een volledig begrip te krijgen, beginnen we met de operanden a en b.

  • ~ (bit­ge­wij­ze NOT, com­ple­ment): Deze operator keert bits om. Een 0 wordt een 1 en een 1 wordt een 0.
  • & (bit­ge­wij­ze AND): Deze operator geeft een 1 weer als beide operanden 1 zijn. Anders wordt een 0 weer­ge­ge­ven.
  • | (bit­ge­wij­ze OR): Deze operator pro­du­ceert een 1 als een van de twee operanden ook 1 is.
  • ^ (XOR of bit­ge­wij­ze ex­clu­sie­ve OR): Deze operator geeft een 0 uit als beide operanden dezelfde waarde hebben. Anders geeft hij een 1 uit.
  • << (links ver­schui­ven): Deze operator ver­schuift operand a b posities naar links. Als dit re­sul­teert in spaties, worden de spaties opgevuld met 0.
  • >> (rechts ver­schui­ven met teken, re­ken­kun­dig): Deze operator ver­schuift alle bits van a met b posities naar rechts. Als de bit met de hoogste waarde vóór de uit­voe­ring was ingesteld, blijft deze daarna ingesteld. Negatieve getallen blijven negatief.
  • >>>> (rechts ver­schui­ven zonder teken, logisch): Deze operator ver­schuift de bits van a met b posities naar rechts. Spaties worden altijd opgevuld met 0.

Bit­ge­wij­ze NOT

De Java bitwise operator bitwise NOT wordt weer­ge­ge­ven door een tilde (~). Deze negeert alle bits, waardoor nullen worden omgezet in enen en enen in nullen. Laten we bij­voor­beeld het getal 20 nemen. In binair ziet dit er als volgt uit: 10100. Als we de bitwise NOT-operator toepassen, wordt elke bit van het getal om­ge­draaid: 10100 wordt 01011. Dit is de waarde van de uit­druk­king ~20. Als we dit binaire getal weer omzetten naar een decimaal getal, krijgen we de waarde -21. Als je dit proces in Java wilt uit­pro­be­ren, voer dan de volgende code en het Java-commando System.out.println in om het resultaat weer te geven.

public class Main {
	public static void main(String[] args) {
	int value1 = 20;
	System.out.println(~value1);
}
}
java

Als je alles correct hebt ingevoerd, zou de uitvoer ‘-21’ moeten zijn.

Bit­ge­wij­ze AND

Bitwise AND ver­ge­lijkt twee getallen in hun binaire vorm bit voor bit. De eerste bit van het eerste getal wordt ver­ge­le­ken met de eerste bit van het tweede getal, de tweede met de tweede bit, enzovoort. Als beide bits 1 zijn, wordt een 1 uit­ge­voerd. Als dit niet het geval is (beide bits zijn 0 of een van de bits is 0), wordt een 0 uit­ge­voerd. In het on­der­staan­de voorbeeld bekijken we de twee decimale getallen 18 en 25. Als binair getal is 18 10010 en 25 in binaire notatie is 11001. Laten we nu deze twee getallen ver­ge­lij­ken en daaruit een derde getal bepalen.

18 = 10010 25 = 11001

De eerste twee bits in de getallen zijn beide 1, dus het re­sul­te­ren­de getal begint ook met 1. De tweede bit van 25 is ook 1, maar de tweede bit van 18 is 0, waardoor het cijfer in het derde getal een 0 wordt. Nadat we beide getallen bit voor bit hebben doorlopen, komen we uit op het binaire getal 10000. Als we dit omzetten naar een decimaal getal, is de uitkomst 16.

De code ziet er als volgt uit:

public class Main {
	public static void main(String[] args) {
	System.out.println(18&25);
}
}
java

De uitvoer in de console moet 16 zijn.

Bit­ge­wij­ze OR

De Java-operator bitwise OR ver­ge­lijkt ook twee getallen bit voor bit. In dit geval hoeft echter slechts één van de twee operanden de waarde 1 te hebben om het resultaat 1 te krijgen. Als we de getallen uit het vorige voorbeeld nemen, ziet dat er als volgt uit:

18 = 10010 25 = 11001

Aangezien alle bits behalve het derde cijfer ten minste één 1 bevatten, is het re­sul­te­ren­de getal: 11011. Om­ge­re­kend krijgen we 27.

Zo ziet dit voorbeeld eruit in code:

public class Main {
	public static void main(String[] args) {
	System.out.println(18|25);
}
}
java

XOR

XOR of bit­ge­wij­ze ex­clu­sie­ve OR (^) is ver­ge­lijk­baar met bit­ge­wij­ze OR. Bij bit­ge­wij­ze OR moeten één of beide operanden 1 zijn om 1 als uitvoer te krijgen. Bij XOR wordt echter alleen een 1 als uitvoer gegeven als precies één van de twee waarden 1 is. Om een beter beeld te krijgen van hoe XOR werkt, kijken we naar een voorbeeld:

18 = 10010 25 = 11001

De eerste twee bits hebben de waarde 1, dus met deze bit­ge­wij­ze operator in Java is het resultaat 0. De tweede bit van 18 is 0, maar de tweede bit van 25 is 1. Dit re­sul­teert in de waarde 1. Als we doorgaan, krijgen we het getal 01011. In decimale vorm is dit 11.

Hier is de code:

public class Main {
	public static void main(String[] args) {
	System.out.println(18^25);
}
}
java

Links ver­schui­ven ver­schuift de bits van waarde a naar links met de afstand b. De re­sul­te­ren­de lege plekken worden opgevuld met 0. Een int-waarde die 32 bits in een geheugen inneemt, il­lu­streert dit duidelijk. Laten we opnieuw het getal 20 of 10010 nemen en dit ver­schui­ven met de b-waarde 2 om de c-waarde 1001000 te krijgen. Aan het einde worden twee nullen geplaatst. 1001000 komt overeen met de decimale waarde 72.

Zo ziet dit proces er in code uit:

public class Main {
	public static void main(String[] args) {
	int a = 20;
	int b = 2;
	int c = (a << b);
	System.out.println(c);
}
}
java

Rech­ter­ver­schui­ving met teken

Rechts ver­schui­ven werkt andersom. Hier worden bits van de waarde a met de waarde b naar rechts ver­scho­ven, wat de waarde c oplevert. Als gevolg hiervan worden de laatste bits weg­ge­la­ten. Als we 20 of 10010 twee plaatsen naar rechts ver­schui­ven, is het resultaat 100 of 4.

Hier is de code:

public class Main {
	public static void main(String[] args) {
	System.out.println(20 >> 2);
}
}
java

Het is be­lang­rijk om op te merken dat als a een positief getal is, de spaties worden opgevuld met 0. Als het negatief is, worden de spaties vervangen door 1.

Rech­ter­ver­schui­ving zonder teken

In principe werkt de Java bitwise operator rechts ver­schui­ven zonder teken (>>>) op dezelfde manier. Het enige verschil is dat de ruimtes die aan de lin­ker­kant ontstaan door de ver­schui­ving naar rechts altijd worden opgevuld met 0. Dit re­sul­teert altijd in een positief getal, zelfs als de start­waar­de negatief was.

Ga naar hoofdmenu