Ar Java bitu ope­ra­to­riem varat manipulēt ar at­se­viš­ķiem bitiem jebkādā veidā, kā vēlaties. Septiņi operatori ir struk­tu­rē­ti līdzīgi un atbilst fiksētiem no­tei­ku­miem, kas ir viegli apgūstami.

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

Java operatori ir svarīgs ins­tru­ments, strādājot ar prog­ram­mē­ša­nas valodu. Papildus daudzām citām iespējām un funkcijām, tie piedāvā iespēju manipulēt ar vis­ma­zā­ka­jām ie­spē­ja­ma­jām in­for­mā­ci­jas vienībām: bitiem. Bitiem (bi­nā­ra­jiem 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 ne­pie­cie­šams bitu operators Java. To var piemērot skait­lis­ka­jiem datu tipiem (byte, char, int, short, long).

Lai gan šī funkcija nav ne­pie­cie­ša­ma ikdienā, tā var būt noderīga daudzās si­tuā­ci­jās. Piemēram, tā var noderēt, ja vēlaties ietaupīt vietu, kon­ver­tē­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­ā­ka­jām shēmu ope­rā­ci­jām. Tāpēc ir svarīgi izprast Java bitu operatoru pa­matfun­kci­jas.

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 ope­ran­diem a un b.

  • ~ (bitu NOT, kom­ple­men­tārs): Šis operators apgriež bitu vērtības. 0 kļūst par 1, bet 1 kļūst par 0.
  • & (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 ope­ran­diem ir 1.
  • ^ (XOR vai bitu eks­klu­zī­vais OR): Šis operators izvada 0, ja abiem ope­ran­diem ir vienāda vērtība. Pretējā gadījumā tas izvada 1.
  • << (pa kreisi): Šis operators pārvieto operandu a pa kreisi par b pozīcijām. Ja rezultātā rodas atstarpes, tās tiek aiz­pil­dī­tas ar 0.
  • >> (labais nobīde ar zīmi, arit­mē­tis­ka): Š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.
  • >>>> (nesignēta pār­vie­to­ša­na 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 vien­i­nie­kiem un vien­i­nie­kus par nulles. Ņemsim, piemēram, skaitli 20. Binārā formātā tas izskatās šādi: 10100. Ja pie­mē­ro­jam bitu operatoru NOT, visi skaitļa biti tiks apmainīti: 10100 kļūst par 01011. Šī ir iz­teik­smes ~20 vērtība. Ja šo bināro skaitli atkal pārvēršam de­ci­mā­la­jā 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.

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

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 sa­lī­dzi­nā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ā ap­ska­tī­sim divus decimālos skaitļus 18 un 25. Binārā formā 18 ir 10010, bet 25 binārā formā ir 11001. Tagad sa­lī­dzi­nā­sim šos divus skaitļus un no­teik­si­me 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 de­ci­māl­skait­lī, rezultāts būs 16.

Kods izskatās šādi:

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

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 ope­ran­diem ir jābūt vērtībai 1, lai rezultāts būtu 1. Ja iz­man­to­jam skaitļus no ie­priek­šē­jā piemēra, tas iz­ska­tī­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ār­rē­ķi­not, iegūstam 27.

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

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

XOR

XOR jeb bitu eks­klu­zī­vais vai (^) ir līdzīgs bitu vai. Bitu vai gadījumā vienam vai abiem ope­ran­diem 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ēļ, iz­man­to­jot š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. De­ci­mā­la­jā formā tas ir 11.

Šeit ir kods:

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

Pāreja pa kreisi

Pār­vie­to­jot pa kreisi, vērtības a biti tiek pār­vie­to­ti pa kreisi par attālumu b. Rezultātā radušās tukšās vietas tiek aiz­pil­dī­tas ar 0. To skaidri ilustrē int vērtība, kas atmiņā aizņem 32 bitus. Ņemsim atkal skaitli 20 vai 10010 un pār­vie­to­sim to par b vērtību 2, lai iegūtu c vērtību 1001000. Beigās tiek ievietoti divi nulles. 1001000 atbilst de­ci­mā­la­jai vērtībai 72.

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

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

Pār­vie­to­ša­na pa labi ar zīmi

Labais no­bī­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:

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

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

Pār­vie­to­ša­na pa labi bez zīmes

Principā Java bitu operators labais no­bī­dī­jums bez zīmes (>>>) darbojas tāpat. Vienīgā atšķirība ir tā, ka telpas, kas iz­vei­do­jas kreisajā pusē, no­bī­do­ties pa labi, vienmēr tiek aiz­pil­dī­tas ar 0. Tas vienmēr rada pozitīvu skaitli, pat ja sākotnējā vērtība bija negatīva. 4c5f986ec517d687f98f93f0abe2fb9b

e147393cf30084fd4e831d7848643eb9

Go to Main Menu