A Java bitműveleti operátorokkal az egyes biteket tetszés szerint manipulálhatja. A hét operátor felépítése hasonló, és könnyen megtanulható, rögzített szabályokat követ.

Mik azok a bitműveleti operátorok és mire használják őket?

A Java operátorok fontos eszközök a programozási nyelv használata során. A sok más lehetőség és funkció mellett lehetővé teszik a legkisebb lehetséges információegységek, a bitek manipulálását. A bitek (bináris számjegyek) saját számrendszerrel rendelkeznek, amely a 0 és 1 értékeken alapul. Ha bináris értékeket bitről bitre szeretne lekérdezni, akkor Java-ban bitműveleti operátorra van szüksége. Ezt a numerikus adattípusokra (byte, char, int, short, long) alkalmazhatja.

Bár ezt a funkciót nem kell naponta használni, sok helyzetben hasznos lehet. Például akkor jöhet jól, ha helyet szeretnél megtakarítani az adatok konvertálásakor, ha az XOR operátort szeretnéd használni, vagy ha csak egy bitet szeretnél megváltoztatni. Ezek képezik az alapját minden magasabb szintű áramköri műveletnek is. Ezért fontos megérteni a Java bitműveleti operátorok alapvető működését.

Melyek a Java bitműveleti operátorok?

A Java nyelvben összesen hét különböző bitműveleti operátor létezik. Az átfogó megértés érdekében az a és b operandusokkal kezdjük.

  • ~ (bitwise NOT, komplementum): Ez az operátor megfordítja a biteket. A 0 1-re, az 1 pedig 0-ra változik.
  • & (bitwise AND): Ez az operátor 1-et ad ki, ha mindkét operandus 1. Ellenkező esetben 0-t ad ki.
  • | (bitwise OR): Ez az operátor 1-et ad ki, ha a két operandus közül az egyik 1.
  • ^ (XOR vagy bitwise exclusive OR): Ez az operátor 0-t ad ki, ha mindkét operandus értéke azonos. Ellenkező esetben 1-et ad ki.
  • << (balra tolás): Ez az operátor az a operandust b pozícióval balra tolja. Ha ez üres helyeket eredményez, akkor az üres helyeket 0-val tölti ki.
  • >> (jobbra tolás előjellel, aritmetikai): Ez az operátor az a összes bitjét b pozícióval jobbra tolja. Ha a legmagasabb értékű bit a végrehajtás előtt be volt állítva, akkor utána is beállítva marad. A negatív számok negatívak maradnak.
  • >>>> (jel nélküli jobbra tolás, logikai): Ez az operátor a biteket b pozícióval jobbra tolja. A szóközöket mindig 0-val tölti ki.

Bitwise NOT

A Java bitwise NOT operátorát egy hullámjel (~) jelöli. Ez az összes bitet negálja, a nullákat egyesekké, az egyeseket nullákká alakítja. Vegyük például a 20-as számot. Bináris formában így néz ki: 10100. Ha a bitwise NOT operátort alkalmazzuk, a szám minden bitje megfordul: 10100-ből 01011 lesz. Ez a ~20 kifejezés értéke. Ha ezt a bináris számot visszaalakítjuk decimális számmá, a -21 értéket kapjuk. Ha ezt a folyamatot Java-ban szeretné kipróbálni, írja be a következő kódot és a Java System.out.println parancsot az eredmény kinyomtatásához.

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

Ha mindent helyesen írt be, akkor a kimenetnek „-21”-nek kell lennie.

Bitwise AND

A bitwise AND két számot bitről bitre összehasonlít bináris formában. Az első szám első bitjét összehasonlítja a második szám első bitjével, a másodikat a második bitjével, és így tovább. Ha mindkét bit 1, akkor 1-et ad ki. Ha ez nem így van (mindkét bit 0 vagy az egyik bit 0), akkor 0-t ad ki. Az alábbi példában megvizsgáljuk a 18 és 25 decimális számokat. Bináris számként a 18 10010, a 25 pedig 11001. Most hasonlítsuk össze ezt a két számot, és határozzuk meg belőlük egy harmadik számot.

18 = 10010 25 = 11001

A számok első két bitje mindkettő 1, így az eredményül kapott szám is 1-gyel kezdődik. A 25 második bitje szintén 1, de a 18 második bitje 0, így a harmadik számjegy 0 lesz. Miután mindkét számot bitről bitre átnéztük, a 10000 bináris számot kapjuk. Ha ezt tizedes számmá alakítjuk, az eredmény 16 lesz.

A kód így néz ki:

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

A konzol kimenete 16 legyen.

Bitwise OR

A Java bitwise OR operátor szintén bitről bitre hasonlítja össze a két számot. Ebben az esetben azonban csak az egyik operandusnak kell 1 értékűnek lennie ahhoz, hogy az eredmény 1 legyen. Ha az előző példában szereplő számokat vesszük, akkor ez így fog kinézni:

18 = 10010 25 = 11001

Mivel a harmadik számjegy kivételével minden bit legalább egy 1-est tartalmaz, az eredményül kapott szám: 11011. Átszámítva 27-et kapunk.

Így néz ki ez a példa kódban:

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

XOR

Az XOR vagy bitwise exclusive OR (^) hasonló a bitwise OR-hoz. A bitwise OR esetében az egyik vagy mindkét operandusnak 1-nek kell lennie ahhoz, hogy 1-es kimenet legyen. Az XOR esetében azonban csak akkor lesz 1-es kimenet, ha pontosan az egyik érték 1. Az XOR működésének jobb megértése érdekében nézzünk meg egy példát:

18 = 10010 25 = 11001

Az első két bit értéke 1, így ezzel a bitműveleti operátorral Java-ban az eredmény 0. A 18 második bitje 0, de a 25 második bitje 1. Ez 1-es értéket eredményez. Ha folytatjuk, akkor a 01011 számot kapjuk. Tizedes formában ez 11.

Itt van a kód:

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

Balra eltolás

A balra tolás az a érték bitjeit b távolságra balra tolja. Az így keletkező üres helyeket 0-val tölti ki. Ezt jól szemlélteti egy 32 bitet elfoglaló int érték. Vegyük újra a 20 vagy 10010 számot, és toljuk el b értékkel 2-vel, így kapjuk a c értéket 1001000. Két nulla kerül a végére. A 1001000 a 72 decimális értéknek felel meg.

Így néz ki ez a folyamat a kódban:

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

Jobb eltolás előjellel

A jobbra tolás fordítva működik. Itt az a érték bitjei a b értékkel jobbra tolódnak, ami a c értéket eredményezi. Ennek eredményeként az utolsó bitek kimaradnak. Ha a 20 vagy 10010 értéket két hellyel jobbra toljuk, az eredmény 100 vagy 4 lesz.

Itt van a kód:

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

Fontos megjegyezni, hogy ha a pozitív szám, akkor a helyeket 0-val töltjük ki. Ha negatív, akkor a helyeket 1-gyel helyettesítjük.

Jobb eltolás jel nélkül

Elvileg a Java bitműveleti operátor jellel nem rendelkező jobbra tolás (>>>) ugyanúgy működik. Az egyetlen különbség az, hogy a jobbra tolás által a bal oldalon keletkező helyeket mindig 0-val tölti ki. Ez mindig pozitív számot eredményez, még akkor is, ha a kiindulási érték negatív volt.

Ugrás a főmenübe