168 ROZDZIAŁ 23. POWSZECHNE PRAKTYKI • — logiczne “nie” Oprócz tego są także przesunięcia ( « oraz » ). Zastanówmy się teraz, jak je wykorzystać w praktyce. Załóżmy, że zajmujemy się jednobajtową zmienną. unsigned char i = 2; Z matematyki wiemy, że zapis binarny tej liczby wygląda tak (w ośmiobitowej zmiennej): 00000010. Jeśli teraz np. chcielibyśmy “zapalić” drugi bit od lewej (tj. bit, którego zapalenie niejako “doda” do liczby wartość 2 6) powinniśmy użyć logicznego lub: unsigned char i = 2; i |= 64; Gdzie 64=2 6. Odczytywanie wykonuje się za pomocą tzw. maski bitowej. Polega to na: 1. wyzerowaniu bitów, które są nam w danej chwili niepotrzebne 2. odpowiedniemu przesunięciu bitów, dzięki czemu szukany bit znajdzie się na pozycji pierwszego bitu od prawej Do “wyłuskania” odpowiedniego bitu możemy posłużyć się operacją “i” — czyli operato- rem & . Wygląda to analogicznie do posługiwania się operatorem “lub”: unsigned char i = 3; /* bitowo: 00000011 */ unsigned char temp = 0; temp = i & 1; /* sprawdzamy najmniej znaczący bit - czyli pierwszy z prawej */ if (temp) { printf ("bit zapalony"); else { printf ("bit zgaszony"); } Jeśli nie władasz biegle kodem binarnym, tworzenie masek bitowych ułatwią ci przesunię- cia bitowe. Aby uzyskać liczbę która ma zapalony bit o numerze n (bity są liczone od zera), przesuwamy bitowo w lewo jedynkę o n pozycji: 1
(…)
… ułatwią ci przesunięcia bitowe. Aby uzyskać liczbę która ma zapalony bit o numerze n (bity są liczone od zera),
przesuwamy bitowo w lewo jedynkę o n pozycji:
1 << n
Jeśli chcemy uzyskać liczbę, w której zapalone są bity na pozycjach l, m, n — używamy
sumy logicznej (“lub”):
(1 << l) | (1 << m) | (1 << n)
Jeśli z kolei chcemy uzyskać liczbę gdzie zapalone są wszystkie bity poza n, odwracamy
ją za pomocą…
... zobacz całą notatkę
Komentarze użytkowników (0)