Operatori Bitwise (bit a bit)

      Nessun commento su Operatori Bitwise (bit a bit)
Ragazzi rieccomi con un altro tutorial sul linguaggio C! :DHo deciso di trattare in questa guida al linguaggio C anche gli operatori bitwise, un argomento spesso considerato noioso e inutile. Vi capisco, anche io l’ho pensato quando li ho studiati. Però poi ho scoperto che sono particolarmente utili ed efficienti per scrivere programmi di sistema (che includono compilatori e sistemi operativi), programmi di cifratura, programmi di grafica e programmi per i quali è basilare un uso efficiente della memoria. Gli operatori bitwise sono appunto degli speciali operatori che il C fornisce, per manipolare i bit e campi di bit.

QUALI SONO GLI OPERATORI BITWISE E DOVE OPERANO

Gli operatori bitwise che il linguaggio C fornisce sono sei, e operano a livello di bit su dati di tipo INTERO. Partiremo dagli operatori di shift (o scorrimento, è uguale) per poi arrivare al complemento bitwise, all’and bitwise, l’or esclusivo bitwise e l’or inclusivo bitwise).

ATTENZIONE: non confondeteli con gli operatori booleani!! Anche se potrebbero dare output uguali, sono una cosa completamente differente!


OPERATORI DI SHIFT

Questi operatori sono utilissimi per trasformare la rappresentazione binaria di un intero facendo scorrere i suoi bit verso sinistra o verso destra. In C abbiamo due operatori di scorrimento:

<< SCORRIMENTO A SINISTRA

>> SCORRIMENTO A DESTRA

Ripetiamo, che possono essere usati su dati di tipo intero, incluso il tipo char.

Ad esempio, se ho la scrittura: i<<j, il valore di i si otterrà facendo scorrere di j posizioni verso sinistra i bit di i. Per ogni bit che “fuoriesce” dall’estrema sinistra di i viene aggiunto uno zero sul lato destro. Stesso discorso si può fare per la scrittura: i>>j.  Nel caso i sia un numero negativo, il risultato dipenderà dall’implementazione: alcune implementazioni aggiungono zeri all’estremo sinistro, altre conservano il bit segno aggiungendo degli uno. Quindi per garantire una maggiore portabilità del programma, è meglio lavorare con gli operatori di scorrimento su numeri unsigned (senza segno).

Portiamo qualche esempio:

unsigned short i,j;

i=13;       // i vale 13, binario: 0000000000001101

j=i<<2;   // j adesso varrà 52, in binario:                          0000000000110100

Così facendo nessuno degli operatori andrà a modificare il valore dell’operando. Per modificarlo, dobbiamo usare gli operatori composti: <<= oppure >>=

IMPORTANTE: Gli operatori bitwise hanno precedenza inferiore rispetto agli operatori aritmetici, quindi attenzione a dove mettere le parentesi per indicare la precedenza!

ALTRI OPERATORI BITWISE

Gli operatori bitwise che ci rimangono da analizzare sono:

~ (o tilde) che indica il COMPLEMENTO BITWISE

& che indica l’AND BITWISE

^ che indica l’OR ESCLUSIVO BITWISE

| che indica l’OR INCLUSIVO BITWISE

Notate che sono ordinati da quello che ha precedenza maggiore a quello che ha precedenza minore. Gli operatori complemento, and, or esclusivo e inclusivo eseguono operazioni booleane su tutti i bit dei loro operando, l’operatore complemento invece, complementa il suo operando (COMPLEMENTARE: dove ci sono gli zeri vengono sostituiti degli uno e viceversa). L’operatore & effettua l’operazione di and booleano su tutti i bit degli operandi. In ultimo gli operatori or esclusivo e inclusivo sono simili, con la differenza che l’or esclusivo produce uno 0 se entrambi gli operandi hanno un bit settato a 1, mentre in quel caso l’operatore or inclusivo prdocue un 1.

ESEMPI:

unsigned short i,j,h;

i=21, j=56;

h=~i; //  Adesso h vale 65514

h=i&j; // Adesso h vale 16

h=i | j; // Adesso h vale 61

h=i^j; // Adesso h vale 45

ATTENZIONE: Gli operatori visti poco fa hanno precedenza inferiore di quelli di uguaglianza (!= , == , ecc). Di conseguenza, anche qui, usate bene le parentesi per impostare una precedenza!

E tutto sugli operatori  bitwise, alla prossima!