# Kas ir Java bitu operatori un kā tos lietot

Ar Java bitu operatoriem varat manipulēt ar atsevišķiem bitiem jebkādā veidā, kā vēlaties. Septiņi operatori ir strukturēti līdzīgi un atbilst fiksētiem noteikumiem, kas ir viegli apgūstami.

## Kas ir bitu operatori un kādiem nolūkiem tie tiek izmantoti?

Java operatori ir svarīgs instruments, strādājot ar programmēšanas valodu. Papildus daudzām citām iespējām un funkcijām, tie piedāvā iespēju manipulēt ar vismazākajām iespējamajām informācijas vienībām: bitiem. Bitiem (*binārajiem cipariem*) ir sava skaitļu sistēma, kas balstās uz vērtībām 0 un 1. Ja vēlaties pieprasīt binārās vērtības pa bitam, jums ir nepieciešams bitu operators Java. To var piemērot **skaitliskajiem datu tipiem** (byte, char, int, short, long).

Lai gan šī funkcija nav nepieciešama ikdienā, tā var būt noderīga daudzās situācijās. Piemēram, tā var noderēt, ja vēlaties ietaupīt vietu, **konvertējot datus**, ja vēlaties izmantot **XOR operatoru** vai ja **vienkārši vēlaties mainīt bitu**. Tās ir arī pamats visām augstākajām shēmu operācijām. Tāpēc ir svarīgi izprast Java bitu operatoru pamatfunkcijas.

## Kādi ir Java bitu operatori?

Java valodā kopumā ir septiņi dažādi bitu operatori. Lai iegūtu vispusīgu izpratni, sāksim ar operandiem *a* un *b*.

- **~ (bitu NOT, komplementārs)**: Šis operators apgriež bitu vērtības. 0 kļūst par 1, bet 1 kļūst par 0.
- **&amp; (bitu AND)**: Šis operators izvada 1, ja abi operandi ir 1. Pretējā gadījumā tiek izvadīts 0.
- **| (bitu OR)**: Šis operators izvada 1, ja viens no diviem operandiem ir 1.
- **^ (XOR vai bitu ekskluzīvais OR)**: Šis operators izvada 0, ja abiem operandiem ir vienāda vērtība. Pretējā gadījumā tas izvada 1.
- **&lt;&lt; (pa kreisi)**: Šis operators pārvieto operandu *a* pa kreisi par *b* pozīcijām. Ja rezultātā rodas atstarpes, tās tiek aizpildītas ar 0.
- **&gt;&gt; (labais nobīde ar zīmi, aritmētiska)**: Šis operators nobīda visus *a* bitu par *b* pozīcijām pa labi. Ja bits ar augstāko vērtību tika iestatīts pirms izpildes, tas paliek iestatīts arī pēc izpildes. Negatīvie skaitļi paliek negatīvi.
- **&gt;&gt;&gt;&gt; (nesignēta pārvietošana pa labi, loģiska)**: Šis operators pārvieto *a* bitu pa labi par *b* pozīcijām. Atstarpes vienmēr aizpilda ar 0.

## Bitu NOT

Java bitu operators bitu NOT tiek attēlots ar tildu (~). Tas **noliedz visus bitus**, pārvēršot nulles par vieniniekiem un vieniniekus par nulles. Ņemsim, piemēram, skaitli 20. Binārā formātā tas izskatās šādi: 10100. Ja piemērojam bitu operatoru NOT, visi skaitļa biti tiks apmainīti: 10100 kļūst **par 01011**. Šī ir izteiksmes ~20 vērtība. Ja šo bināro skaitli atkal pārvēršam decimālajā skaitlī, iegūstam vērtību -21. Ja vēlaties izmēģināt šo procesu Java, ievadiet šādu kodu un Java komandu `System.out.println`, lai izvadītu rezultātu.

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

Ja esat ievadījis visu pareizi, izvadei jābūt “-21”.

## Bitu AND

Bitwise AND **salīdzina divus skaitļus to binārā formā** bitu pa bitam. Pirmā skaitļa pirmais bits tiek salīdzināts ar otrā skaitļa pirmo bitu, otrais ar otro bitu un tā tālāk. Ja abi biti ir 1, tiek izvadīts 1. Ja tas tā nav (abi biti ir 0 vai viens no bitiem ir 0), tiek izvadīts 0. Zemāk redzamajā piemērā apskatīsim divus decimālos skaitļus 18 un 25. Binārā formā 18 ir 10010, bet 25 binārā formā ir 11001. Tagad salīdzināsim šos divus skaitļus un noteiksime no tiem trešo skaitli.

18 = 10010 25 = 11001

Pirmie divi biti skaitļos ir abi 1, tāpēc rezultātā iegūtais skaitlis arī sākas ar 1. Otrais bits skaitlī 25 arī ir 1, bet otrais bits skaitlī 18 ir 0, tāpēc trešā skaitļa cipars ir 0. Pēc abu skaitļu bitu pa bitam pārbaudes iegūstam bināro skaitli **10000**. Ja to pārvēršam decimālskaitlī, rezultāts būs 16.

Kods izskatās šādi:

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

Konsoles izvadei jābūt 16.

## Bitu OR

Java operators bitwise OR arī salīdzina divus skaitļus bitu pa bitam. Tomēr šajā gadījumā tikai vienam no diviem operandiem ir jābūt vērtībai 1, lai rezultāts būtu 1. Ja izmantojam skaitļus no iepriekšējā piemēra, tas izskatīsies šādi:

18 = 10010 25 = 11001

Tā kā visi biti, izņemot trešo ciparu, satur vismaz vienu 1, rezultātā iegūstam skaitli: **11011**. Pārrēķinot, iegūstam 27.

Šeit ir redzams, kā šis piemērs izskatās kodā:

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

## XOR

XOR jeb bitu ekskluzīvais vai (^) ir līdzīgs bitu vai. Bitu vai gadījumā vienam vai abiem operandiem jābūt 1, lai izvade būtu 1. Tomēr XOR gadījumā 1 tiek izvadīts tikai tad, ja **tieši viena no divām vērtībām** ir 1. Lai labāk izprastu, kā darbojas XOR, aplūkosim piemēru:

18 = 10010 25 = 11001

Pirmie divi biti ir ar vērtību 1, tādēļ, izmantojot šo bitu operatoru Java valodā, rezultāts ir 0. Otrais bits no 18 ir 0, bet otrais bits no 25 ir 1. Rezultāts ir vērtība 1. Turpinot, iegūstam skaitli **01011**. Decimālajā formā tas ir 11.

Šeit ir kods:

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

## Pāreja pa kreisi

Pārvietojot pa kreisi, vērtības *a* biti tiek pārvietoti pa kreisi par attālumu *b*. Rezultātā radušās **tukšās vietas tiek aizpildītas ar 0**. To skaidri ilustrē int vērtība, kas atmiņā aizņem 32 bitus. Ņemsim atkal skaitli 20 vai 10010 un pārvietosim to par *b* vērtību 2, lai iegūtu *c* vērtību **1001000**. Beigās tiek ievietoti divi nulles. 1001000 atbilst decimālajai vērtībai 72.

Šeit ir redzams, kā šis process izskatās kodā:

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

## Pārvietošana pa labi ar zīmi

Labais nobīdījums darbojas pretēji. Šajā gadījumā vērtības *a* biti tiek nobīdīti pa labi par vērtību *b*, kas rada c vērtību. Rezultātā **pēdējie biti tiek izlaisti**. Ja mēs nobīdām 20 vai 10010 divas vietas pa labi, rezultāts ir **100** vai 4.

Šeit ir kods:

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

Svarīgi atzīmēt, ka, ja *a* ir pozitīvs skaitlis, atstarpes tiek aizpildītas ar 0. Ja tas ir negatīvs, atstarpes tiek aizstātas ar 1.

## Pārvietošana pa labi bez zīmes

Principā Java bitu operators labais nobīdījums bez zīmes (&gt;&gt;&gt;) darbojas tāpat. Vienīgā atšķirība ir tā, ka telpas, kas izveidojas kreisajā pusē, nobīdoties pa labi, **vienmēr** tiek **aizpildītas ar 0**. Tas vienmēr rada pozitīvu skaitli, pat ja sākotnējā vērtība bija negatīva.


This is a markdown version of: [https://www.ionos.com/lv-lv/digitalguide/timekla-vietnes/timekla-izstrade/java-bitu-operatori/](https://www.ionos.com/lv-lv/digitalguide/timekla-vietnes/timekla-izstrade/java-bitu-operatori/) for AI/LLM consumption.