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
Tag: programowanie 
Problem stworzenia własnego miernika baterii, nie jest specjalnie skomplikowany. Opiera się na odczycie kilku plików tekstowych i odpowiedniej analizie znajdujących się tam danych. Co jest potrzebne? Przede wszystkim Linux z obsługą ACPI (jeżeli inne mierniki działają, to na pewno masz już dobrze przygotowane jądro). Przyda się również znajomość jakiegoś języka programowania. Całość powinna zająć maksymalnie kilka godzin, zależnie od sposobu prezentacji.