tom000 - Personal Website - Strona główna
decor1 Wpisy na blogu decor2
01.052011
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
Trackback: http://tom000.info/blog/trackback/operatory-bitowe.html

Dodaj komentarz

Opcje

= (wpisz wynik działania z obrazka)
Copyleft (C) tom000.info 2004-2012. Some rights reserved.