Dopełnienie jedynkowe lub bitowa negacja: ~

Operator zmienia każde zero/jedynkę na jedynkę/zero:

~(00010010) == (11101101)

wart = ~wart; // zmienia wartosc zmiennej wart

wartość zmiennej jest zmieniana po użyciu operatora przypisania. Operator ~ nie zmienia wartości zmiennej.

Bitowa koniunkcja (AND): &

Dwuargumentowy operator & tworzy nową wartość przez porównanie kolejnych bitów dwóch operandów. Bit w wartości wyjściowej jest równy 1 tylko wtedy, gdy oba odpowiadające mu bity w operandach są równe 1:


(00010010) & (10111101) == (00010000)

(wart &= 0377) == (wart = wart & 0377); 

Bitowa alternatywa (OR): |

Dwuargumentowy operator | tworzy nową wartość przez porównanie kolejnych bitów dwóch operandów. Bit w wartości wyjściowej jest równy 1, gdy przynajmniej jeden z odpowiadających mu bitów w operandach jest równy 1:


(00010010) | (10111101) == (10111111)

(wart |= 0377) == (wart = wart | 0377); 

Bitowa alternatywa wyłączająca (XOR): ^ 

Dwuargumentowy operator ^ tworzy nową wartość przez porównanie kolejnych bitów dwóch operandów. Bit w wartości wyjściowej jest równy 1, gdy dokładnie jeden z odpowiadających mu bitów w operandach jest równy 1: 


(00010010) ^ (10111101) == (10101111)

(wart ^= 0377) == (wart = wart ^ 0377); 

 

Zastosowanie

Maski
Maska jest układem bitów, w którym niektóre bity Są włączone (1) lub wyłączone (0):


wart &= MASKA; // MASKA = 2; // (00000010) 

przypisuje wartość 0 wszystkim bitom zmiennej wart z wyjątkiem bitu nr 1. Jeżeli bit nr 1 w zmiennej wart jest równy 1, bit pozostaje nie zmieniony, w przeciwnym wypadku zostaje zmieniony na 0.

Włączanie bitów


wart |= MASKA; // MASKA = 2; // (00000010)

instrukcja powoduje włączenie tylko tych bitów, które są włączone w stałej MASKA.

Wyłączanie bitów


wart |= ~MASKA; // MASKA = 2; // 2 = (00000010) // ~MASKA == (11111101)

instrukcja powoduje wyłączenie tylko tych bitów, które są włączone w stałej MASKA.

Odwracanie bitów
Jeśli b jest bitem (o wartości 1 lub 0), to 1^b daje 0, jeśli b jest równy 1, lub 1, gdy b jest równy 0. 0^b w każdym przypadku daje b. 


(wart ^= MASKA) == (wart = wart ^ MASKA); // MASKA = 2; // 2 = (00000010)

Sprawdzenie wartości bitu
Sprawdzenie, czy bit nr 1 w zmiennej wart jest włączony, odbywa się poprzez zamaskowanie pozostałych bitów w zmiennej wart, tak aby porównywany był tylko bit nr 1:

if (wart & MASKA) == MASKA)  // MASKA = 2
    printf ("OK");


0 Komentarzy

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *