Gli operatori sui bit nel linguaggio C
Nel linguaggio C sono inclusi molti operatori dedicati alle operazioni sui bit. Gli operatori Bitwise consentono di svolgere delle elaborazioni e dei confronti direttamente sui singoli bit.
In una memoria informatica i dati sono registrati tramite i numeri binari. Ogni carattere alfanumerico e ogni numero hanno un codice binario ( byte ) espresso sotto forma di zero e uno (bit).
Quali sono gli operatori sui bit nel linguaggio C?
I principali operatori sui bit sono:
Somma di bit o OR logico ( | )
L'operatore OR logico ( | ) consente di sommare i singoli bit tra due numeri binari.
a|b
Esempio di OR logico sui bit
Il numero 11 equivale al numero binario 1011 mentre il numero 12 a 1100. Assegniamo alle due variabili i valori A=11 e B=12.
a=11;
b=12;
c=a|b;
La somma logica C di 12 e 11 non restituisce 23, come si potrebbe pensare, bensì 15. L'operatore OR ( disgiunzione inclusiva ) verifica i bit nella rappresentazione binaria dei due operandi A e B in ogni posizione.
Nel risultato finale viene scritto uno (1) quando nella stessa posizione è presente il numero uno (1) in almeno uno degli operandi. In caso contrario, viene scritto zero.
Il numero 15 in binario è rappresentato con la sequenza 1111 ed è, quindi, il risultato dell'operazione A|B.
L'operatore OR binario di assegnazione
Per assegnare il risultato dell'OR logico direttamente a delle due variabili degli operandi è possibile utilizzare l'operatore di assegnazione |=.
a=11;
b=12;
a|=b;
Nell'esempio precedente, il programma esegue l'operazione A|B ( 12|11 ) e assegna il risultato ( 15 ) alla variabile A.
Prodotto di bit o AND logico ( & )
L'operatore AND logico ( & ) moltiplica i singoli bit di due numeri binari.
a&b
Esempio di AND logico sui bit
Assegniamo A=11 e B=12. Nella rappresentazione binaria il numero 11 è 1011 mentre il numero 12 è 1100.
a=11;
b=12;
c=a&b;
La moltiplicazione logica C di 12 e 11 è uguale a 8. L'operatore AND ( congiunzione logica ) controlla i singoli bit dei due numeri A e B nella rappresentazione binaria per ogni posizione.
Nel risultato finale viene scritto uno (1) quando nella stessa posizione è presente il numero uno (1) in entrambi gli operandi A e B. In caso contrario, viene scritto zero (0).
Il numero 8 nel sistema binario è rappresentato dalla sequenza 1000 ed è, quindi, il risultato dell'operazione A&B.
Disgiunzione esclusiva sui bit o XOR logico ( ^ )
Nel linguaggio C l'operatore XOR è rappresentato dal simbolo ^. L'operatore XOR è uguale a uno (1) quando soltanto uno dei due operandi è uguale a uno (1). In caso contrario, è uguale a zero (0).
a^b
Esempio di Xor logico sui bit
Nel seguente codice sono stati assegnati alle variabili due valori, A=11 e B=12. I numeri 11 e 12 nel sistema binario sono rappresentati rispettivamente dalle sequenze 1011 e 1100.
a=11;
b=12;
c=a^b;
Nel linguaggio C lo XOR logico verifica i bit dei due numeri binari per ogni singola posizione. Quando in una colonna soltanto uno degli operatori è uno (1), lo XOR scrive uno (1) nel risultato in quella posizione. Viceversa, in tutti gli altri casi scrive zero.
Il risultato C dell'operatore XOR è pari a 7. Il numero sette in linguaggio binario è rappresentato con la sequenza 111. Da notare, a differenza dell'operatore OR, nello XOR quando entrambi gli operandi sono uguali a uno, il risultato è zero.
L'operatore XOR con assegnazione
Per assegnare il risultato dell'operazione XOR a una delle variabili degli operandi, è sufficiente aggiungere il simbolo uguale (=) dell'assegnazione dopo l'operatore XOR (^).
a^=b;
L'operatore ^= indica al programma di assegnare il risultato dello XOR logico A^B alla variabile A.
La negazione dei bit ( ~ )
L'operatore di negazione dei bit nel linguaggio C è rappresentato dal carattere tilde ( ~ ). Si tratta di un operatore unario poiché utilizza soltanto un operando. La negazione di bit restituisce la negazione dei bit di un numero binario.
c=~a
Esempio di negazione dei bit
Alla variabile A assegniamo il valore 11. Nella rappresentazione binaria il numero unici è 1011.
a=11;
c=~a;
L'operatore di negazione dei bit verifica ogni cifra binaria del numero 1011, da sinistra verso destra, sostituendo lo zero con uno e l'uno con lo zero. In questo modo si ottiene il complemento binario del numero.
Il risultato è il numero binario negativo 10100 equivalente al numero decimale -12. Essendo un numero binario negativo 10100 è rappresentato in complemento a 2, quindi equivale al numero positivo +20 bensì il numero negativo -12.
Scorrimento dei bit a sinistra ( << ) e destra ( >> )
Nel linguaggio C l'operatore dello scorrimento dei bit consente di spostare tutti i bit verso sinistra ( << ) o verso destra ( >> ). L'operatore segue il nome della variabile (A) ed è seguito dal numero di posizioni N da spostare ( shift ).
Lo scorrimento dei bit verso sinistra per N posizioni è il seguente:
a<<n
Analogamente, lo spostamento dei bit verso destra per N posizioni è il seguente:
a>>n
Esempio di scorrimento verso sinistra
Nel seguente codice sorgente viene assegnato il valore 11 alla variabile A. Il numero undici in binario è rappresentato dalla sequenza 1011.
a=11;
c=a<<1;
L'operatore di scorrimento << sposta verso sinistra i bit, aggiungendo uno zero a destra.
Il risultato finale C è il numero binario 10110 che equivale al numero decimale +22.
Se avessimo spostato i bit di due posizioni ( A<<2 ) avremmo ottenuto il numero 101100, equivalente al numero decimale 44, e così via.
Esempio di scorrimento verso destra
Riprendiamo lo stesso esempio precedente modificando il verso dello scorrimento verso destra (>>). Il numero 11 è rappresentato in binario con la sequenza 1011.
a=11;
c=a>>1;
L'operatore di scorrimento << sposta verso destra i bit, aggiungendo uno zero a destra, eliminando la posizione binaria meno significativa.
Il risultato finale è il numero binario 101 che equivale al numero decimale +5.
L'operatore di scorrimento dei bit di assegnazione
E' possibile applicare lo scorrimento su una variabile assegnandogli direttamente il nuovo valore.
L'operatore di scorrimento dei bit verso sinistra con assegnazione è <<=.
a<<=1;
Quello di scorrimento dei bit verso destra con assegnazione è >>=.
a>>=1;
In questi casi, il programma esegue lo scorrimento dei bit, verso destra (>>) o sinistra (<<), e subito dopo assegna (=) il risultato alla medesima variabile A.