Autor: Dondu
Kurs języka C: Spis treści
Operator bitowy | realizuje operację dodawania bitowego. Wynikiem dodawania bitowego jest jedynka, gdy na tych samych pozycjach co najmniej jeden bit jest jedynką. Gdy oba bity są zerami wynikiem także jest zero.
76543210 numery bitów
--------
10110010 zmienna a
01011000 zmienna b
--------
11111010 wynik dodawania bitowego: a | b
--------
10110010 zmienna a
01011000 zmienna b
--------
11111010 wynik dodawania bitowego: a | b
Przykład 1 (w kompilatorze)
unsigned char a = 0b10110010; unsigned char b = 0b01011000; unsigned char wynik; wynik = a | b; //dodawanie bitowe OR
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 dodawania bitowego. Będziemy w nich używać tzw. maski bitów, czyli liczby z odpowiednio ustawionymi bitami, w zależności od potrzeb.
1. Ustawianie wybranych bitów.
W przypadku, gdy chcemy ustawić jakieś bity wystarczy wykonać dodawanie bitowe danej zmiennej z maską, w której bity, które mają być ustawione są jedynkami, a pozostałe zerami.
Na przykład chcemy w zmiennej a ustawić bit 1, bit 3 oraz bit 6. Dodajemy więc bitowo zmienną a z maską ustawioną wg powyższej zasady:
76543210 numery bitów
--------
10110010 zmienna a
01001010 maska
--------
11111010 zmienna a z ustawionymi bitami 1, 3 oraz 6
--------
10110010 zmienna a
01001010 maska
--------
11111010 zmienna a z ustawionymi bitami 1, 3 oraz 6
W powyższym przykładzie ustawione zostały tylko bit 3 oraz bit 6, a bit 1 pozostał taki jaki był wcześniej, czyli jedynką.
Przykład 3 (w kompilatorze)
unsigned char a = 0b10110010; //zeruj bity 1 i 4 a &= 0b11101101; //odpowiednik: a = a & 0b11101101;
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
13
Witam
OdpowiedzUsuńMam jedno, pewnie proste pytanie.
Dlaczego w przykładzie pierwszym dodając dziesiętnie 178 do 88 nie wychodzi 266 tylko 250? Widzę, że binarnie na jedynkę zmienia się tylko 4 i 6 bit i wynik odpowiada po przeliczeniu liczbie 250, ale nie powinno być tak, że dodając dziesiętnie i binarnie powinniśmy dostać takie same wyniki?
Witaj.
UsuńDzieje się tak właśnie dlatego, że to jest dodawanie bitowe, a nie dziesiętne. Przedstawione jest na niebieskim tle przed pierwszym przykładem. Innymi słowy można powiedzieć, że każdy bit pierwszej zmiennej jest dodawany tyko z odpowiadającym mu bitem w drugiej zmiennej, a wynik przedstawiany tylko na tym samym bicie.
Czy teraz już rozumiesz?
Witam.
OdpowiedzUsuńKomentarz nie do zatwierdzenia, chciałbym poinformować że w przykładzie 3 na stronie(nie w kompilatorze) jest chyba błąd, ponieważ jest tutaj zastosowane mnożenie a nie dodawanie.
Pozdrawiam
Faktycznie jest błąd - muszę się zastanowić, co miał reprezentować przykład nr 3 i poprawić :-)
UsuńDziękuję za zwrócenie uwagi!
Przykład w kompilatorze też się chyba nie pokrywa.
OdpowiedzUsuńSuma bitowa 0b10110010 | 0b01001010 wychodzi: 0b11111010, czyli ustawienie bitów 1,3 i 6, natomiast zapisana jako odpowiednik iloczyn bitowy 0b10110010 & 0b01001010 daje: 00000010, czyli ustawia tylko pierwszy bit. Czy dobrze to rozumiem czy sam się zagubiłem w swoich myślach? :)
Pozdrawiam i gratuluję bardzo fajnego kursu ;)