20:53
Operatory bitowe
Dla programistów (głównie tych początkujących) operatory bitowe często stanowią problem ich zrozumienia i wykorzystania. Dlatego też postaram się tutaj w skrócie pokazać na czym to wszystko polega.
Operatory bitowe w większości języków wysokiego poziomu wyglądają raczej podobnie. Należą do nich: & (AND), | (OR), ~ (NOT), ^ (XOR), << (przesunięcie w lewo), >> (przesunięcie w prawo).
Jak nazwa wskazuje – w operatorach bitowych operuje się bezpośrednio na bitach, więc do ich wykorzystania niezbędna będzie umiejętność posługiwania się systemem binarnym.
Przesunięcia
Przesunięcia bitowe polegają po prostu na przesunięciu bitów o podaną liczbę pozycji. Dla przykładu wybierzmy liczbę 5. W systemie binarnym będzie ona zapisana jako (000101). W wyniku jej przesunięcia o wskazaną liczbę bitów otrzymamy wartości:
| Liczba | Postać binarna | Operacja | Postać binarna po operacji | Wynik |
|---|---|---|---|---|
| 5 | (000101) | 5 << 1 | (001010) | 10 |
| 5 | (000101) | 5 << 3 | (101000) | 40 |
| 5 | (000101) | 5 >> 1 | (000010) | 2 |
Łączenie liczb
Przy pomocy operatorów &, |, ^ możemy połączyć ze sobą kilka liczb porównując ze sobą ich kolejne bity. Najłatwiej można to zrozumieć patrząc na poniższą tabelkę:
| Liczby | Wynik dla & (AND) | Wynik dla | (OR) | Wynik dla ^ (XOR) |
|---|---|---|---|
| 5 (0101) i 3 (0011) | 1 (0001) | 7 (0111) | 6 (0110) |
| 9 (1001) i 4 (0100) | 0 (0000) | 13 (1101) | 13 (1101) |
| 3 (0011) i 1 (0001) | 1 (0001) | 3 (0011) | 2 (0010) |
Jak to wykorzystać?
Operacje bitowe można wykorzystać np. w celu przekazania do funkcji, lub przechowania w bazie wielu informacji typu prawda/fałsz w jednej zmiennej, za pomocą wcześniej przygotowanych flag/mask. Flagi (zapisane np. w postaci binarnej, ósemkowej, heksadecymalnej) przekazujemy tworząc nową liczbę przy pomocy operatora |. Następnie sprawdzamy wystąpienie danej flagi w tej liczbie operatorem &. Sprawa jest dość prosta i żeby za dużo nie tłumaczyć wystarczy spojrzeć na krótki poniższy kod i zwrócone wyniki.
class BityTest {
final public static int FLAG1 = 0001;
final public static int FLAG2 = 0010;
final public static int FLAG3 = 0100;
public static void main(String[] args){
parametersTest(FLAG1);
parametersTest(FLAG1 | FLAG3);
parametersTest(FLAG1 | FLAG3 | FLAG2);
}
public static void parametersTest(int flags){
System.out.print("przekazane flagi: ");
if((flags & FLAG1) == FLAG1)
System.out.print("FLAG1 ");
if((flags & FLAG2) == FLAG2)
System.out.print("FLAG2 ");
if((flags & FLAG3) == FLAG3)
System.out.print("FLAG3 ");
}
}
Wynik:
przekazane flagi: FLAG1 przekazane flagi: FLAG1 FLAG3 przekazane flagi: FLAG1 FLAG2 FLAG3
Wpisy na blogu 
Dodaj komentarz