Med Java-bitvise ope­ra­to­rer kan du ma­ni­p­u­le­re in­di­vi­du­el­le bits på enhver ønsket måde. De syv ope­ra­to­rer er opbygget på samme måde og følger faste regler, der er lette at lære.

Hvad er bitvise ope­ra­to­rer, og hvad bruges de til?

Java-ope­ra­to­rer er et vigtigt værktøj, når man arbejder med pro­gram­me­rings­spro­get. Ud over de mange andre mu­lig­he­der og funk­tio­ner giver de dig mulighed for at ma­ni­p­u­le­re de mindste mulige in­for­ma­tions­en­he­der: bits. Bits (binære cifre) har deres eget talsystem baseret på værdierne 0 og 1. Hvis du vil fo­re­spør­ge binære værdier bit for bit, har du brug for en bitvis operator i Java. Du kan anvende dette på de numeriske datatyper (byte, char, int, short, long).

Selvom du ikke har brug for funk­tio­nen til daglig, kan den være nyttig i mange si­tu­a­tio­ner. Den kan for eksempel være praktisk, hvis du vil spare plads ved kon­ver­te­ring af data, hvis du vil bruge XOR-ope­ra­to­ren, eller hvis du bare vil ændre en bit. De er også grund­la­get for alle højere kredsløbs­o­pe­ra­tio­ner. Derfor er det vigtigt at forstå den grund­læg­gen­de funk­tio­na­li­tet af Java-bitvise ope­ra­to­rer.

Hvilke Java-bitvise ope­ra­to­rer findes der?

Der er i alt syv for­skel­li­ge bitvise ope­ra­to­rer i Java. For at få en hel­heds­for­stå­el­se starter vi med ope­ran­der­ne a og b.

  • ~ (bitvis NOT, kom­ple­ment): Denne operator in­ver­te­rer bits. Et 0 bliver til et 1, og et 1 bliver til et 0.
  • & (bitvis AND): Denne operator udgiver en 1, hvis begge operander er 1. Ellers udgives en 0.
  • | (bitvis OR): Denne operator pro­du­ce­rer en 1, hvis en af de to operander også er 1.
  • ^ (XOR eller bitvis eksklusiv OR): Denne operator udgiver en 0, hvis begge operander har samme værdi. Ellers udgiver den en 1.
  • << (venstre skift): Denne operator skifter operanden a til venstre med b po­si­tio­ner. Hvis dette re­sul­te­rer i mellemrum, udfyldes mel­lem­rum­me­ne med 0.
  • >> (høj­re­skift med fortegn, arit­me­tisk): Denne operator skifter alle bits i a b po­si­tio­ner til højre. Hvis biten med den højeste værdi var indstil­let før ud­fø­rel­sen, forbliver den indstil­let bagefter. Negative tal forbliver negative.
  • >>>> (usigneret høj­re­skift, logisk): Denne operator skifter bitene i a til højre med b po­si­tio­ner. Mellemrum udfyldes altid med 0.

Bitvis NOT

Java-bit­vis­o­pe­ra­tø­ren bitvis NOT re­præ­sen­te­res af en tilde (~). Den negerer alle bits, så nuller bliver til ettaller og ettaller bliver til nuller. Lad os tage tallet 20 som eksempel. I binær form ser det sådan ud: 10100. Hvis vi anvender bitwise NOT-ope­ra­to­ren, vil hver bit i tallet blive vendt: 10100 bliver til 01011. Dette er værdien af udtrykket ~20. Hvis vi kon­ver­te­rer dette binære tal tilbage til et de­ci­mal­tal, får vi værdien -21. Hvis du vil prøve denne proces i Java, skal du indtaste følgende kode og Java-kom­man­do­en System.out.println for at få re­sul­ta­tet.

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

Hvis du har indtastet alt korrekt, skal re­sul­ta­tet være ‘-21’.

Bitvis AND

Bitwise AND sam­men­lig­ner to tal i deres binære form bit for bit. Den første bit i det første tal sam­men­lig­nes med den første bit i det andet tal, den anden med den anden bit og så videre. Hvis begge bits er 1, udgives en 1. Hvis dette ikke er tilfældet (begge bits er 0 eller en af bitsene er 0), udgives en 0. I eksemplet nedenfor ser vi på de to de­ci­mal­tal 18 og 25. Som binærtal er 18 10010, og 25 i binær notation er 11001. Lad os nu sam­men­lig­ne disse to tal og bestemme et tredje tal ud fra dem.

18 = 10010 25 = 11001

De to første bits i tallene er begge 1, så det re­sul­te­ren­de tal starter også med 1. Den anden bit i 25 er også 1, men den anden bit i 18 er 0, hvilket gør cifret i det tredje tal til et 0. Efter at have gen­nem­gå­et begge tal bit for bit, ender vi med det binære tal 10000. Hvis vi kon­ver­te­rer dette til et de­ci­mal­tal, bliver re­sul­ta­tet 16.

Koden ser sådan ud:

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

Outputtet i konsollen skal være 16.

Bitvis OR

Java-ope­ra­to­ren bitwise OR sam­men­lig­ner også to tal bit for bit. I dette tilfælde skal dog kun den ene af de to operander have værdien 1 for at ende med re­sul­ta­tet 1. Hvis vi tager tallene fra det fo­re­gå­en­de eksempel, vil det se sådan ud:

18 = 10010 25 = 11001

Da alle bits undtagen det tredje ciffer in­de­hol­der mindst én 1, bliver det re­sul­te­ren­de tal: 11011. Omregnet får vi 27.

Sådan ser dette eksempel ud i kode:

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

XOR

XOR eller bitvis eksklusiv OR (^) ligner bitvis OR. Med bitvis OR skal den ene eller begge operander være 1 for at give 1 som resultat. Med XOR gives der imid­ler­tid kun 1 som resultat, hvis nøjagtig én af de to værdier er 1. For at få en bedre for­stå­el­se af, hvordan XOR fungerer, kan vi se på et eksempel:

18 = 10010 25 = 11001

De to første bits har værdien 1, så med denne bitvise operator i Java bliver re­sul­ta­tet 0. Den anden bit i 18 er 0, men den anden bit i 25 er 1. Dette giver værdien 1. Hvis vi fort­sæt­ter, får vi tallet 01011. I de­ci­mal­form er dette 11.

Her er koden:

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

Venstre skift

Ven­stre­for­skyd­ning forskydes værdien a til venstre med afstanden b. De re­sul­te­ren­de tomme felter udfyldes med 0. En int-værdi, der optager 32 bits i en hukom­mel­se, il­lu­stre­rer dette tydeligt. Lad os tage tallet 20 eller 10010 for a igen og forskyd det med b-værdien 2 for at få c-værdien 1001000. Der placeres to nuller i slut­nin­gen. 1001000 svarer til de­ci­mal­vær­di­en 72.

Sådan ser denne proces ud i kode:

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

Højre skift med tegn

Høj­re­skift fungerer omvendt. Her skiftes bits af værdien a til højre med værdien b, hvilket giver værdien c. Som følge heraf udelades de sidste bits. Hvis vi skifter 20 eller 10010 to pladser til højre, bliver re­sul­ta­tet 100 eller 4.

Her er koden:

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

Det er vigtigt at bemærke, at hvis a er et positivt tal, udfyldes mel­lem­rum­me­ne med 0. Hvis det er negativt, erstattes mel­lem­rum­me­ne med 1.

Højre skift uden tegn

I prin­cip­pet fungerer Java-bit­vis­o­pe­ra­tø­ren høj­re­skift uden tegn (>>>) på samme måde. Den eneste forskel er, at de mellemrum, der opstår i venstre side ved skiftet til højre, altid udfyldes med 0. Dette re­sul­te­rer altid i et positivt tal, selvom start­vær­di­en var negativ.

Gå til ho­ved­me­nu­en