Operazioni bitwise: lavorare con i bit

Chi si diletta con Arduino o legge articoli del genere sa bene che ad ogni variabile(e non solo) usata all’interno del nostro sketch esiste una corrispondenza binaria.

Quando dichiariamo una variabile in Arduino in questo modo byte x = 1 se andiamo a fare una lettura dei bit otteniamo questo risultato 00000001.

Adesso diamo un’occhiata all’immagine qui sotto, dove troviamo gli operatori bitwise con i relativi nomi, così da renderci conto di cosa stiamo parlando.

bitwise_operators

Il primo operatore di bitwise indicato nella tabella in alto è quello di negazione cioè il NOT ~
Come avrete già intuito, con un’istruzione del tipo:
Con x = 1 cioè 00000001 eseguendo la negazione x = ~x; tutti i bit saranno negati cioè invertiti, gli zeri diventeranno degli uno e gli uno diventeranno degli zeri, in questo modo: 10000000

Il secondo operatore è invece di scorrimento esattamente scorrimento verso sinistra LEFT SHIFT << serve per scorrere di N posizioni i bit verso sinistra, in pratica e per dirla in termini spiccioli, “spinge” con degli 0 anzi con N zeri i bit verso sinistra.
Prendendo di nuovo come esempio la nostra variabile x, eseguendo uno shift verso sinistra di una posizione otterremmo questo:
x = x << 1 ===> 00000001 ===> 00000010
notare come l’unico bit alto cioè l’1 sia avanzato di una posizione verso sinistra e lo spazio dietro sia stato riempito con uno 0.
Proviamo ad applicare un ulteriore shift sempre verso sinistra ma questa volta di 6 posizioni e vediamo cosa succede:
x = x << 6 ===> 00000010 ===> 10000000
ed in fine se proviamo ad effettuare un ulteriore shift ovviamente sempre verso sinistra di una posizione otterremo questo:
x = x << 1 ===> 10000000 ===> 00000000
l’ultimo 1 che ci era rimasto viene spinto fuori e ci rimangono 8 bit settati a zero.

Il terzo operatore è quello di scorrimento verso destra RIGHT SHIFT >> lavora alla stessa identica maniera di LEFT SHIFT, ma invece di spingere verso sinistra, spinge verso destra.
Infatti provando ad eseguire uno spostamento di una posizione verso destra della nostra variabile x ci ritroveremmo subito con 8 bit settati a 0.
x = x >> 1 ===> 00000001 ===> 00000000

Il quarto operatore invece è l’AND & da non confondere con l’AND && booleano.
Questo operatore mette a confronto bit a bit e restituisce 1 se e solo se tutti gli operandi cioè i bit messi a confronto sono settati a 1 altrimenti 0.

00000001
00110001
– – – – – – – –
00000001

Al quinto posto invece troviamo l’OR esclusivo ^
Questo operatore mettere a confronto bit a bit e restituisce 1 se e solo se il numero degli operandi messi a confronto settati ad 1 sono dispari, dunque due bit settati ad 1 restituiranno uno zero.

00000001
00110001
– – – – – – – –
00110000

In fine nella tabella troviamo l’OR |
Questo operatore mettere a confronto bit a bit e restituisce 1 se almeno uno dei bit messi a confronto sia settato ad 1, dunque in questo caso solo davanti a dei bit tutti settati a zero ci ritroveremmo come risultato uno zero.

00000001
00110001
– – – – – – – –
00110001

A questo punto vi invito a lanciare il vostro IDE Arduino e di testare quanto avete appreso in questo articolo consultanto quest’altro articolo.
Buon lavoro e al prossimo articolo 😉