Barninga Z
a- a+

Gli operatori: Operatori logici su bit

Operatori logici su bit 

Gli operatori logici su bit consentono di porre in relazione due valori mediante un confronto effettuato bit per bit. Consideriamo l'operatore di prodotto logico, o and su bit. Quando due bit sono posti in AND, il risultato è un bit nullo a meno che entrambi i bit valgano 1. La tabella illustra tutti i casi possibili nel prodotto logico di due bit, a seconda dei valori che cisacuno di essi può assumere. L'operazione consistente nel porre in AND due valori è spesso indicata col nome di "mascheratura" , in quanto essa ha l'effetto di nascondere in modo selettivo alcuni bit: in particolare viene convenzionalmente chiamato "maschera" il secondo valore. Se nella maschera è presente uno zero, nel risultato c'è sempre uno zero in quella stessa posizione, mentre un 1 nella maschera lascia inalterato il valore del bit originario. Supponiamo, ad esempio, di voler considerare solo gli 8 bit meno significativi di un valore a 16 bit: 

unsigned word;
    char byte;

    word = 2350;
    byte = word & 0xFF;

Il valore 2350, espresso in 16 bit, risulta 0000100100101110, mentre FFh è 0000000011111111. L'operazione di prodotto logico è rappresentabile come 

0000100100101110 &
0000000011111111 =

0000000000101110

ed il risultato è 46. Dall'esempio si trae inoltre che il simbolo dell'operatore di and su bit è il carattere "&": il contesto in cui viene utilizzato consente facilmente di distinguerlo a prima vista dall'operatore  address of, che utilizza il medesimo simbolo pur avendo significato completamente diverso. 

AND 0 1
0 0 0
1 0 1

Più sottile appare la differenza dall'operatore di and logico "&&" , sebbene questo abbia grafia differente. L'and su bit agisce proprio sui singoli bit delle due espressioni, mentre l'and logico collega i valori logici delle medesime (vero o falso). Ad esempio, l'espressione 

((a > b) && c)

restituisce un valore diverso da 0 se a è maggiore di b e, contemporaneamente, c è diversa da 0. Invece, l'espressione 

((a > b) & c)

restituisce un valore diverso da 0 se a è maggiore di b e, contemporaneamente, c è dispari. Infatti un'espressione vera restituisce 1, e tutti i valori dispari hanno il bit meno significativo ad 1, pertanto il prodotto logico ha un bit ad 1 (quello meno significativo, ed è dunque diverso da 0) solo se entrambe le condizioni sono vere. 

L'operatore di or su bit è invece utilizzato per calcolare quella che viene comunemente indicata come somma logica di due valori. Quando due bit vengono posti in OR, il risultato è sempre 1, tranne il caso in cui entrambi i bit sono a 0. Il comportamento dell'operatore di somma logica è riassunto nella tabella. Si noti che il concetto di maschera può essere validamente applicato anche alle operazioni di OR tra due valori, in particolare quando si voglia assegnare il valore 1 ad uno o più bit di una variabile. Infatti la presenza di un 1 nella maschera porta ad 1 il corrispondente bit del risultato, mentre uno 0 nella maschera lascia inalterato il bit del valore originario (questo comportamento è l'esatto opposto di quello dell'operatore "&"). 

OR 0 1
0 0 1
1 1 1

L'operazione di OR sui bit dei valori 2350 e 255 (FFh) è rappresentabile come segue: 

0000100100101110 |
0000000011111111 =

0000100111111111

e restituisce 2599. Il simbolo dell'operatore di or su bit è "|" , e non va confuso con quello dell'operatore di or logico "||"; del resto tra i due operatori esistono differenze di significato del tutto analoghe a quelle accennate poco fa circa gli operatori di and su bit e di and logico. 

Esiste un terzo operatore logico su bit: l'operatore di xor su bit, detto anche "or esclusivo". Il suo simbolo è un accento circonflesso ("^"). Un'operazione di XOR tra due bit fornisce risultato 0 quando i due bit hanno uguale valore (cioè sono entrambi 1 o entrambi 0), mentre restituisce 1 quando i bit hanno valori opposti (il primo 1 ed il secondo 0, o viceversa): la tabella evidenzia quanto affermato. 

XOR 0 1
0 0 1
1 1 0

Se ne trae che la presenza di un 1 in una maschera utilizzata in XOR, dunque, inverte il bit corrispondente del valore originario. Rispolverando ancora una volta (con la solenne promessa che sarà l'ultima) l'esempio del valore 2350 mascherato con un 255, si ha: 

0000100100101110 ^
0000000011111111 =

0000100111010001

Il risultato è 2513

 



Ti potrebbe interessare anche

commenta la notizia

C'è 1 commento
Lorenzo
Hai qualche domanda da fare?