Co jsou bitové operátory v Javě a jak je používat
Pomocí bitových operátorů jazyka Java můžete manipulovat s jednotlivými bity libovolným způsobem. Sedm operátorů má podobnou strukturu a řídí se pevnými pravidly, která se snadno naučíte.
Co jsou bitové operátory a k čemu se používají?
Java operátory jsou důležitým nástrojem při práci s programovacím jazykem. Kromě mnoha dalších možností a funkcí vám dávají možnost manipulovat s nejmenšími možnými jednotkami informací: bity. Bity (binární číslice) mají svůj vlastní číselný systém založený na hodnotách 0 a 1. Pokud chcete dotazovat binární hodnoty bit po bitu, potřebujete v Javě bitový operátor. Ten můžete použít na numerické datové typy (byte, char, int, short, long).
Ačkoli tuto funkci nebudete potřebovat každý den, může se hodit v mnoha situacích. Například se může hodit, pokud chcete při konverzi dat ušetřit místo, pokud chcete použít operátor XOR nebo pokud chcete pouze změnit bit. Jsou také základem pro všechny vyšší operace obvodů. Proto je důležité pochopit základní funkčnost bitových operátorů v Javě.
Jaké bitové operátory existují v jazyce Java?
V jazyce Java existuje celkem sedm různých bitových operátorů. Abychom získali komplexní přehled, začneme s operandy a a b.
- ~ (bitová negace, doplněk): Tento operátor invertuje bity. 0 se změní na 1 a 1 se změní na 0.
- & (bitové AND): Tento operátor vygeneruje 1, pokud jsou oba operandy 1. V opačném případě vygeneruje 0.
- | (bitové OR): Tento operátor vygeneruje hodnotu 1, pokud je jeden z obou operandů také 1.
- ^ (XOR nebo bitové exkluzivní OR): Tento operátor vydá 0, pokud mají oba operandy stejnou hodnotu. V opačném případě vydá 1.
- << (posun doleva): Tento operátor posune operand a o b pozic doleva. Pokud to vede k mezerám, mezery budou vyplněny hodnotou 0.
- >> (posun vpravo se znaménkem, aritmetický): Tento operátor posune všechny bity a o b pozic vpravo. Pokud byl bit s nejvyšší hodnotou nastaven před provedením, zůstane nastaven i poté. Záporná čísla zůstanou záporná.
- >>>> (posun vpravo bez znaménka, logický): Tento operátor posune bity a o b pozic vpravo. Mezery jsou vždy vyplněny hodnotou 0.
Bitové NOT
Bitový operátor NOT v jazyce Java je reprezentován vlnovkou (~). Neguje všechny bity, mění nuly na jedničky a jedničky na nuly. Vezměme si například číslo 20. V binární podobě vypadá takto: 10100. Pokud použijeme bitový operátor NOT, každý bit čísla se přepne: 10100 se změní na 01011. To je hodnota výrazu ~20. Pokud toto binární číslo převedeme zpět na desítkové číslo, dostaneme hodnotu -21. Pokud chcete tento proces vyzkoušet v Javě, zadejte následující kód a příkaz Java System.out.println pro výstup výsledku.
public class Main {
public static void main(String[] args) {
int value1 = 20;
System.out.println(~value1);
}
}javaPokud jste vše zadali správně, výsledek by měl být „-21“.
Bitové AND
Bitové AND porovnává dvě čísla v jejich binární podobě bit po bitu. První bit prvního čísla se porovnává s prvním bitem druhého čísla, druhý s druhým bitem a tak dále. Pokud jsou oba bity 1, je výstupem 1. Pokud tomu tak není (oba bity jsou 0 nebo jeden z bitů je 0), je výstupem 0. V následujícím příkladu se podíváme na dvě desítková čísla 18 a 25. Jako binární číslo je 18 10010 a 25 v binární notaci je 11001. Nyní porovnáme tato dvě čísla a určíme z nich třetí číslo.
18 = 10010 25 = 11001
První dva bity v číslech jsou oba 1, takže výsledné číslo také začíná číslicí 1. Druhý bit čísla 25 je také 1, ale druhý bit čísla 18 je 0, takže číslice ve třetím čísle je 0. Po projití obou čísel bit po bitu dostaneme binární číslo 10000. Pokud ho převedeme na desítkové číslo, výsledek bude 16.
Kód vypadá takto:
public class Main {
public static void main(String[] args) {
System.out.println(18&25);
}
}javaVýstup v konzoli by měl být 16.
Bitová operace OR
Java operátor bitwise OR také porovnává dvě čísla bit po bitu. V tomto případě však pouze jeden z obou operandů musí mít hodnotu 1, aby výsledek byl 1. Pokud použijeme čísla z předchozího příkladu, bude to vypadat takto:
18 = 10010 25 = 11001
Jelikož všechny bity kromě třetího čísla obsahují alespoň jednu 1, výsledné číslo je: 11011. Po převodu dostaneme 27.
Takto vypadá tento příklad v kódu:
public class Main {
public static void main(String[] args) {
System.out.println(18|25);
}
}javaXOR
XOR nebo bitová exkluzivní OR (^) je podobná bitové OR. U bitové OR musí být jeden nebo oba operandy 1, aby byl výstup 1. U XOR je však 1 výstupem pouze v případě, že přesně jedna z obou hodnot je 1. Abychom lépe pochopili, jak XOR funguje, podívejme se na příklad:
18 = 10010 25 = 11001
První dva bity mají hodnotu 1, takže s tímto bitovým operátorem v Javě je výsledek 0. Druhý bit čísla 18 je 0, ale druhý bit čísla 25 je 1. Výsledkem je hodnota 1. Pokud pokračujeme dál, dostaneme číslo 01011. V desítkové formě je to 11.
Tady je kód:
public class Main {
public static void main(String[] args) {
System.out.println(18^25);
}
}javaPosun doleva
Posun vlevo posune bity hodnoty a o vzdálenost b doleva. Výsledné mezery jsou vyplněny hodnotou 0. To lze jasně ilustrovat na hodnotě int, která zabírá 32 bitů v paměti. Vezměme si opět číslo 20 nebo 10010 a posuňme jej o hodnotu b 2, abychom získali hodnotu c 1001000. Na konec se umístí dvě nuly. 1001000 odpovídá desítkové hodnotě 72.
Takto vypadá tento proces v kódu:
public class Main {
public static void main(String[] args) {
int a = 20;
int b = 2;
int c = (a << b);
System.out.println(c);
}
}javaPosun doprava se znaménkem
Posun doprava funguje opačně. Zde jsou bity hodnoty a posunuty doprava o hodnotu b, což vede k hodnotě c. Výsledkem je, že poslední bity jsou vynechány. Pokud posuneme 20 nebo 10010 o dvě místa doprava, výsledkem je 100 nebo 4.
Tady je kód:
public class Main {
public static void main(String[] args) {
System.out.println(20 >> 2);
}
}javaJe důležité si uvědomit, že pokud je a kladné číslo, mezery se vyplní číslem 0. Pokud je záporné, mezery se nahradí číslem 1.
Posun doprava bez znaménka
V zásadě funguje bitový operátor Java pro posun vpravo bez znaménka (>>>) stejným způsobem. Jediný rozdíl spočívá v tom, že mezery vytvořené na levé straně posunem vpravo jsou vždy vyplněny hodnotou 0. Výsledkem je vždy kladné číslo, i když počáteční hodnota byla záporná.