Autor: Dondu
Kurs języka C: Spis treści
Operator bitowy & realizuje operację mnożenia bitowego. Wynikiem mnożenia bitowego jest jedynka tylko i wyłącznie wtedy, gdy na tych samych pozycjach bity są jedynką. W pozostałych przypadkach wynikiem jest zero.
76543210 numery bitów
--------
10110010 zmienna a
10011000 zmienna b
--------
10010000 wynik mnożenia bitowego: a & b
--------
10110010 zmienna a
10011000 zmienna b
--------
10010000 wynik mnożenia bitowego: a & b
Przykład 1 (w kompilatorze)
unsigned char a = 0b10110010; unsigned char b = 0b10011000; unsigned char wynik; wynik = a & b; //mnożenie bitowe AND
Wynik działania programu możesz zobaczyć w kompilatorze CManiak.
Łączenie operatorów: &=
Jak każdy inny operator, także i ten można łączyć z operatorem przypisania.
Przykład 2 (w kompilatorze)
wynik &= a; //odpowiednik: wynik = wynik & a;
Podstawowe zastosowania:
Poniżej przykłady zastosowania mnożenia bitowego. Będziemy w nich używać tzw. maski bitów, czyli liczby z odpowiednio ustawionymi bitami, w zależności od potrzeb.
1. Zerowanie wybranych bitów.
W przypadku, gdy chcemy wyzerować jakieś bity wystarczy wykonać mnożenie bitowe danej zmiennej z maską, w której bity, które mają być wyzerowane są zerami, a te które mają zostać niezmienione są jedynkami.
Na przykład chcemy w zmiennej a wyzerować bit 1 oraz bit 4. Mnożymy więc bitowo zmienną a z maską ustawioną wg powyższej zasady:
76543210 numery bitów
--------
10110010 zmienna a
11101101 maska
--------
10100000 zmienna a z wyzerowanymi bity 1 i 4
--------
10110010 zmienna a
11101101 maska
--------
10100000 zmienna a z wyzerowanymi bity 1 i 4
Przykład 3 (w kompilatorze)
unsigned char a = 0b10110010; //zeruj bity 1 i 4 a &= 0b11101101; //odpowiednik: a = a & 0b11101101;
2. Sprawdzenie wybranego bitu.
Jeżeli chcemy ustalić, czy dany bit ma wartość jeden lub zero, wystarczy dokonać mnożenia bitowego z maską gdzie sprawdzany bit jest jedynką, a następnie sprawdzić, czy wynik jest różny od zera. Wykorzystamy tutaj pewną właściwość instrukcji if( ) upraszczającą zapis do niezbędnego minimum.
Przykład 4 (w kompilatorze)
unsigned char a = 0b10110010; //sprawdzamy wybrany bit if(a & 0b00010000){ //bit jest jedynką }else{ //bit jest zerem }
3. Sprawdzenie, czy co najmniej jeden z kilku bitów jest jedynką.
Jeżeli chcemy ustalić, czy któryś z kilku bitów ma wartość jeden postępujemy podobnie jak w przykładzie powyżej.
Przykład 5 (w kompilatorze)
unsigned char a = 0b10110010; //sprawdzamy wybrane bity if(a & 0b00010001){ //co najmniej jeden z bitów jest jedynką }else{ //żaden z bitów nie jest jedynką }
4. Sprawdzenie, czy wszystkie wybrane bity są jedynkami.
Ten przypadek jest nieco bardziej skomplikowany. Gdy chcemy ustalić, czy wszystkie z kilku wybranych bitów mają wartość jeden, musimy najpierw dokonać mnożenia bitowego z maską, a później sprawdzić czy to co zostało jest dokładnie tym czego oczekiwaliśmy, czyli maską.
Przykład 6 (w kompilatorze)
unsigned char a = 0b10110010; //sprawdzamy wybrane bity if((a & 0b00010010) == 0b00010010){ //wszystkie wybrane bity są jedynkami }else{ //co najmniej jeden z wybranych bitów nie jest jedynką }
W przykładach znajdują się liczby w zapisie dwójkowym, ale oczywiście można je zastąpić szesnastkowymi lub definicjami bitów, czy całych masek.
Kurs języka C: Spis treści
12
Dlaczego w kursie są pokazywane rzeczy, które nie pojawiały się w poprzednich jego częściach? Proszę wybaczyć moją być może zerową wiedzę, ale jestem zupełnie "zielony" i chciałbym uczyć się krok po kroku, podczas gdy w kolejnych częściach kursu, czy też w przykładach z kompilatora pojawiają się rzeczy wcześniej nie wyjaśnione, chociażby funkcja, która ma wyświetlać wynik mnożenia binarnego, nie mówiąc już o tym, że samo pojęcie funkcji, jej definiowania etc. nie zostało wcześniej zdefiniowane. Proszę wybaczyć tą krytykę, ale po prostu z początku kurs ten wydał mi się świetną okazją, aby sprawnie nauczyć się programowania w tym języku.
OdpowiedzUsuńRozpocząłem pisanie kursu 2 sierpnia 2012. Do dzisiaj ukazały się 33 artykuły, czyli około jednego dziennie. To całkiem sporo, a czas nie jest z gumy :-)
OdpowiedzUsuńDlatego też na stronie spisu treści kursu umieściłem informację, że proszę o cierpliwość.
Kolejność powstawania artykułów generalnie nie jest przypadkowa, ale faktycznie brakuje na ten moment artykułu o funkcjach.
Co do funkcji konwersji na postać binarną (sądzę, że o niej piszesz), to świadomie nie tłumaczę jej zasady działania, ponieważ obejmuje to wiele zagadnień, które trzeba znać, by zrozumieć. Proszę po prostu ją używać :-)
Czegoś tutaj nie rozumiem...
OdpowiedzUsuńPatrząc na przykład zastosowania nr. 3 (Sprawdzenie, czy co najmniej jeden z kilku bitów jest jedynką), to aby to sprawdzić nie powinniśmy użyć maski z samymi jedynkami (0b11111111), bo moim zdaniem tylko wtedy sprawdzimy, czy na którejkolwiek pozycji w zmiennej a któryś bit jest jedynką. To wydaje mi się logiczne, jeżeli się mylę proszę mnie poprawić ;)
Pozdro.