# Kaj so bitni operaterji v Javi in kako jih uporabljati

Z bitnimi operacijami v Javi lahko posamezne bite obdelujete na kakršen koli način želite. Sedem operacij je strukturiranih podobno in sledi fiksnim pravilom, ki so enostavna za učenje.

## Kaj so bitni operaterji in za kaj se uporabljajo?

Java operaterji so pomembno orodje pri delu s programskim jezikom. Poleg mnogih drugih možnosti in funkcij vam omogočajo manipulacijo najmanjših možnih enot informacij: bitov. Biti (*binarne števke*) imajo svoj številčni sistem, ki temelji na vrednostih 0 in 1. Če želite poizvedovati binarne vrednosti bit po bit, potrebujete bitni operator v Javi. To lahko uporabite za **numerične podatkovne tipe** (byte, char, int, short, long).

Čeprav te funkcije ne boste potrebovali vsak dan, je lahko koristna v številnih situacijah. Na primer, lahko pride prav, če želite pri **pretvorbi podatkov** prihraniti prostor, če želite uporabiti **operator XOR** ali če **želite samo spremeniti bit**. So tudi osnova za vse višje operacije vezja. Zato je pomembno razumeti osnovno delovanje bitnih operatorjev v Javi.

## Kateri bitni operaterji Java obstajajo?

V Javi je skupaj sedem različnih bitnih operatorjev. Da bi dobili celovito razumevanje, bomo začeli z operandoma *a* in *b*.

- **~ (bitno NOT, dopolnilo)**: Ta operator obrne bite. 0 postane 1, 1 pa postane 0.
- **&amp; (bitno AND)**: Ta operator izpiše 1, če sta oba operanda 1. V nasprotnem primeru izpiše 0.
- **| (bitno OR)**: Ta operator izda 1, če je eden od dveh operandov tudi 1.
- **^ (XOR ali bitno izključno OR)**: Ta operator izda 0, če imata oba operanda enako vrednost. V nasprotnem primeru izda 1.
- **&lt;&lt; (premik v levo)**: Ta operator premakne operand *a* za *b* položajev v levo. Če to povzroči prazne prostore, se ti prostori zapolnijo z 0.
- **&gt;&gt; (premik v desno z znakom, aritmetični)**: Ta operator premakne vse bite *a* za *b* pozicij v desno. Če je bil bit z najvišjo vrednostjo nastavljen pred izvedbo, ostane nastavljen tudi po izvedbi. Negativna števila ostanejo negativna.
- **&gt;&gt;&gt;&gt; (desni premik brez predznaka, logično)**: Ta operator premakne bite *a* za *b* pozicij v desno. Prostori so vedno zapolnjeni z 0.

## Bitno NOT

Bitni operator NOT v Javi je predstavljen s tilde (~). **Negira vse bite**, tako da ničle spremeni v enice in enice v ničle. Vzemimo za primer število 20. V binarnem zapisu izgleda takole: 10100. Če uporabimo bitni operator NOT, se bo vsak bit števila zamenjal: 10100 postane **01011**. To je vrednost izraza ~20. Če to binarno število pretvorimo nazaj v decimalno število, dobimo vrednost -21. Če želite ta postopek preizkusiti v Javi, vnesite naslednjo kodo in ukaz Java `System.out.println`, da izpišete rezultat.

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

Če ste vse vnesli pravilno, naj bi izpis kazal „-21“.

## Bitno AND

Bitwise AND **primerja dve števili v njihovi binarni obliki** bit za bitom. Prvi bit prvega števila se primerja s prvim bitom drugega števila, drugi z drugim bitom in tako naprej. Če sta oba bita 1, je izhod 1. Če to ni primer (oba bita sta 0 ali eden od bitov je 0), je izhod 0. V spodnjem primeru si bomo ogledali dve decimalni številki 18 in 25. Kot binarna številka je 18 10010, 25 v binarni notaciji pa 11001. Sedaj primerjajmo ti dve številki in iz njih določimo tretjo številko.

18 = 10010 25 = 11001

Prva dva bita v številkah sta oba 1, zato se tudi končno število začne z 1. Drugi bit številke 25 je prav tako 1, vendar je drugi bit številke 18 0, zato je števka v tretji številki 0. Po pregledu obeh številk bit za bitom dobimo binarno število **10000**. Če to pretvorimo v decimalno število, bo rezultat 16.

Koda izgleda takole:

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

Izhod v konzoli naj bi bil 16.

## Bitno ali

Java operator bitwise OR prav tako primerja dve številki bit za bitom. V tem primeru pa mora imeti le eden od dveh operandov vrednost 1, da je rezultat 1. Če vzamemo številke iz prejšnjega primera, bo izgledalo takole:

18 = 10010 25 = 11001

Ker vsi biti razen tretjega vsebujejo vsaj eno 1, je končno število: **11011**. Pretvorjeno dobimo 27.

Tako izgleda ta primer v kodi:

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

## XOR

XOR ali bitno izključno OR (^) je podobno bitnemu OR. Pri bitnem OR mora biti eden ali oba operanda 1, da se izpiše 1. Pri XOR pa se 1 izpiše le, če je **natanko ena od dveh vrednosti** 1. Da bi bolje razumeli, kako deluje XOR, si oglejmo primer:

18 = 10010 25 = 11001

Prva dva bita imata vrednost 1, zato je z bitnim operatorjem v Javi rezultat 0. Drugi bit števila 18 je 0, drugi bit števila 25 pa je 1. Rezultat je vrednost 1. Če nadaljujemo, dobimo število **01011**. V decimalni obliki je to 11.

Tukaj je koda:

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

## Premik v levo

Premik v levo premakne bite vrednosti *a* v levo za razdaljo *b*. Nastale **prazne prostore zapolni z 0**. To jasno ponazarja vrednost int, ki zavzema 32 bitov v pomnilniku. Vzemimo spet število 20 ali 10010 in *ga* premaknimo za vrednost *b* 2, da dobimo vrednost c **1001000**. Na konec se postavita dve ničli. 1001000 ustreza decimalni vrednosti 72.

Tako izgleda ta proces v kodi:

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

## Premik v desno z znakom

Desni premik deluje v nasprotni smeri. Tukaj se biti vrednosti *a* premaknejo v desno za vrednost *b*, kar da vrednost c. Posledica tega je, **da se zadnji biti izpustijo**. Če premaknemo 20 ali 10010 za dve mesti v desno, je rezultat **100** ali 4.

Tukaj je koda:

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

Pomembno je opozoriti, da če je *a* pozitivno število, se prostori zapolnijo z 0. Če je negativno, se prostori nadomestijo z 1.

## Premik v desno brez znaka

Načeloma deluje bitni operator Java za premik v desno brez znaka (&gt;&gt;&gt;) na enak način. Edina razlika je, da so prostori, ki nastanejo na levi strani zaradi premika v desno, **vedno zapolnjeni z 0**. To vedno da pozitivno število, tudi če je bila začetna vrednost negativna.


This is a markdown version of: [https://www.ionos.com/sl-si/digitalguide/spletne-strani/razvoj-spletnih-strani/bitni-operaterji-v-javi/](https://www.ionos.com/sl-si/digitalguide/spletne-strani/razvoj-spletnih-strani/bitni-operaterji-v-javi/) for AI/LLM consumption.