# Mis on Java bitiviisilised operaatorid ja kuidas neid kasutada?

Java bitiviisiliste operaatoritega saate üksikuid bitte manipuleerida nii, nagu soovite. Seitse operaatorit on üles ehitatud sarnaselt ja järgivad kindlaid reegleid, mida on lihtne õppida.

## Mis on bitiviisilised operaatorid ja milleks neid kasutatakse?

Java operaatorid on programmeerimiskeele kasutamisel oluline tööriist. Lisaks paljudele teistele võimalustele ja funktsioonidele annavad need võimaluse manipuleerida väikseimaid võimalikke infoyksusi: bitte. Bitidel (*binaarkoodidel*) on oma numbrite süsteem, mis põhineb väärtustel 0 ja 1. Kui soovite küsida binaarväärtusi bithaaval, vajate Java-s bititehnilist operaatorit. Seda saab rakendada **numbrilistele andmetüüpidele** (byte, char, int, short, long).

Kuigi te ei vaja seda funktsiooni igapäevaselt, võib see paljudes olukordades kasulikuks osutuda. Näiteks võib see olla kasulik, kui soovite **andmete teisendamisel** ruumi säästa, kui soovite kasutada **XOR-operaatorit** või kui **soovite lihtsalt ühte bitti muuta**. Need on ka kõigi kõrgema taseme vooluahelate operatsioonide aluseks. Seetõttu on oluline mõista Java bitiviisiliste operaatorite põhilist funktsionaalsust.

## Millised Java bitiviisilised operaatorid on olemas?

Java-s on kokku seitse erinevat bitiviisilist operaatorit. Üldise arusaamise saamiseks alustame operanditest *a* ja *b*.

- **~ (bitwise NOT, komplementaar)**: See operaator pöörab bittidest ümber. 0 muutub 1-ks ja 1 muutub 0-ks.
- **&amp; (bitwise AND)**: See operaator väljastab 1, kui mõlemad operandid on 1. Muul juhul väljastatakse 0.
- **| (bitiviisiline OR)**: See operaator annab tulemuseks 1, kui üks kahest operandist on samuti 1.
- **^ (XOR või bitiviisiline eksklusiivne OR)**: See operaator väljastab 0, kui mõlemad operandid on sama väärtusega. Muul juhul väljastab see 1.
- **&lt;&lt; (vasakule nihutamine)**: see operaator nihutab operandi *a* *b* positsiooni võrra vasakule. Kui selle tulemuseks on tühikud, täidetakse tühikud 0-ga.
- **&gt;&gt; (parempoolne nihutamine märgiga, aritmeetiline)**: See operaator nihutab kõik *a* biti *b* positsiooni võrra paremale. Kui enne täitmist oli seatud kõrgeima väärtusega bit, jääb see pärast täitmist samuti seatuks. Negatiivsed numbrid jäävad negatiivseks.
- **&gt;&gt;&gt;&gt; (märgita parempoolne nihutus, loogiline)**: see operaator nihutab *a* bitti paremale *b* positsiooni võrra. Tühikud täidetakse alati 0-ga.

## Bitwise NOT

Java bitiviisiline operaator bitiviisiline NOT on esindatud tildega (~). See **negeerib kõik bitid**, muutes nullid ühtedeks ja ühed nullideks. Võtame näiteks numbri 20. Binaarselt näeb see välja järgmiselt: 10100. Kui rakendame bitwise NOT operaatorit, vahetuvad kõik numbri bitid: 10100 muutub **01011-ks**. See on väljendi ~20 väärtus. Kui teisendame selle binaarnumbri tagasi kümnendnumbri, saame väärtuse -21. Kui soovite seda protsessi Java-s proovida, sisestage järgmine kood ja Java-käsk `System.out.println` tulemuse väljastamiseks.

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

Kui olete kõik õigesti sisestanud, peaks väljundiks olema „-21”.

## Bitiviisiline AND

Bitwise AND **võrdleb kahte numbrit nende binaarses vormis** bit haaval. Esimese numbri esimest bitti võrreldakse teise numbri esimese bitiga, teist bitti teise bitiga jne. Kui mõlemad bitid on 1, väljastatakse 1. Kui see nii ei ole (mõlemad bitid on 0 või üks bittidest on 0), väljastatakse 0. Allpool toodud näites vaatame kahte kümnendkohta 18 ja 25. Binaarnumbritena on 18 10010 ja 25 11001. Nüüd võrdleme neid kahte numbrit ja määrame nende põhjal kolmanda numbri.

18 = 10010 25 = 11001

Numbrites on esimesed kaks bitti mõlemad 1, seega algab tulemusnumber samuti numbriga 1. Numbrite 25 teine bitt on samuti 1, kuid numbri 18 teine bitt on 0, mistõttu kolmanda numbri number on 0. Pärast mõlema numbri bittide läbivaatamist saame tulemuseks binaarnumbri **10000**. Kui teisendame selle kümnendnumbri, on tulemuseks 16.

Kood näeb välja järgmine:

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

Konsoli väljund peaks olema 16.

## Bitiviisiline OR

Java operaator bitwise OR võrdleb ka kahte numbrit bithaaval. Sel juhul peab aga ainult ühel kahest operandist olema väärtus 1, et tulemuseks oleks 1. Kui võtame eelmise näite numbrid, siis see näeb välja järgmine:

18 = 10010 25 = 11001

Kuna kõik bittid, välja arvatud kolmas number, sisaldavad vähemalt ühte 1, on tulemuseks number: **11011**. Konverteerides saame tulemuseks 27.

Siin on näide, kuidas see kood välja näeb:

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

## XOR

XOR ehk bitiviisiline eksklusiivne OR (^) on sarnane bitiviisilise OR-iga. Bitiviisilise OR-i puhul peab üks või mõlemad operandid olema 1, et väljundiks oleks 1. XOR-i puhul aga on väljundiks 1 ainult siis, kui **täpselt üks kahest väärtusest** on 1. Et paremini mõista, kuidas XOR töötab, vaatame ühte näidet:

18 = 10010 25 = 11001

Esimesed kaks bitti on väärtusega 1, seega Java bititehnilise operaatori abil on tulemuseks 0. 18 teine bitt on 0, kuid 25 teine bitt on 1. Selle tulemuseks on väärtus 1. Kui jätkame, saame numbri **01011**. Desimaalsüsteemis on see 11.

Siin on kood:

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

## Vasakule nihutamine

Vasakule nihutamine nihutab väärtuse *a* bitte vasakule kaugusega *b*. Tekkinud **tühikud täidetakse numbriga 0**. Seda illustreerib hästi int-tüüpi väärtus, mis võtab mälus 32 bitti. Võtame *taas* numbri 20 ehk 10010 ja nihutame seda b-väärtusega 2, saades c-väärtuseks **1001000**. Lõppu lisatakse kaks nulli. 1001000 vastab kümnendväärtusele 72.

Siin on näide, kuidas see protsess koodis välja näeb:

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

## Paremini nihutamine märgiga

Parempoolne nihutamine toimib vastupidiselt. Siin nihutatakse väärtuse *a* bitti väärtuse *b* võrra paremale, mis annab tulemuseks väärtuse c. Selle tulemusena **jäävad viimased bittid välja**. Kui nihutame 20 või 10010 kaks kohta paremale, on tulemuseks **100** või 4.

Siin on kood:

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

Tähtis on märkida, et kui *a* on positiivne number, täidetakse tühikud numbriga 0. Kui see on negatiivne, asendatakse tühikud numbriga 1.

## Parempoolne nihutus ilma märgita

Põhimõtteliselt toimib Java bitiviisiline operaator parempoolne nihutus ilma märgita (&gt;&gt;&gt;) samamoodi. Ainus erinevus on see, et parempoolse nihutuse tulemusel vasakule tekkinud tühikud **täidetakse alati nullidega**. Selle tulemuseks on alati positiivne number, isegi kui algväärtus oli negatiivne.


This is a markdown version of: [https://www.ionos.com/et-ee/digitalguide/veebisaidid/veebiarendus/java-bitiviisilised-operaatorid/](https://www.ionos.com/et-ee/digitalguide/veebisaidid/veebiarendus/java-bitiviisilised-operaatorid/) for AI/LLM consumption.