Usare Arduino per spostare i bit di una variabile

Oltre alle funzioni viste nel precedente articolo, Arduino è capace di eseguirne altre ed in particolare lo spostamento a destra o a sinistra bit a bit. L’operatore per lo spostamento a destra si esprime con questo operatore >> mentre per lo spostamento a sinistra viene usato questo operatore <<.
Per capire meglio cosa avviene utilizziamo delle immagini che semplificano la spiegazione. In questo caso ho una variabile di tipo byte (8 bit) il cui valore è 255. All’interno del chip atmega328 viene allocata, nella memoria ram, uno spazio di 8 bit i cui valori sono settati a 1

Eseguendo uno spostamento a sinistra <<, tutti i bit si spostano di una posizione verso sinistra e nel bit meno significativo (LSB) viene scritto uno zero:

Spostamento a sinistra di bit

Quindi il valore della variabile passa da 255 (in binario 11111111) a 254 (in binario 11111110).

Continuando ad eseguire uno spostamento a sinistra, di una posizione, otteniamo i seguenti valori

252  11111100
24811111000
24011110000
22411100000
19211000000
12810000000
000000000

Il codice che esegue quanto detto è il seguente

//Variabile di tipo byte
byte MiaVar;

void setup()
{
 //init seriale
 Serial.begin(9600);
 //init variabile 11111111
 MiaVar= 255;
}

void loop()
{
 //eseguo uno spostamento a sinistra di 1 posizione
 //memorizzo il valore nella stessa variabile
 MiaVar = MiaVar << 1;

 //invio il dato al serial monitor
 Serial.println(MiaVar);

 //1 secondo di pausa tra una operazione e l'altra
 delay (1000);

}

Allo stesso modo lo spostamento a destra >> esegue un movimento dei bit dal più significativo al meno significativo:

in questo modo otteniamo i seguenti valori:

12701111111
63 00111111
3100011111
1500001111
700000111
300000011
100000001
000000000

Gli operatori >> e << possono spostare i bit anche di diverse posizioni a seconda di come gestiamo l’operatore, ad esempio se voglio spostare i bit di quattro posizioni a sinistra dovrò scrivere:

    MiaVar = MiaVar << 4;

in questo modo la variabile MiaVar passerà dal valore 255 al 240.

Generalmente le operazioni bit a bit vengono usate perché sono eseguite molto velocemente da Arduino. Possono anche essere usate per semplici calcoli matematici, ad esempio moltiplicare o dividere un numero, come di seguito:

   //Moltiplica * 2
   Risultato = Miavar << 1;
   //Moltiplica * 4
   Risultato = Miavar << 2;
   //Moltiplica * 8
   Risultato = Miavar << 3;
   //divide / 2
   Risultato = Miavar >> 1;
   //divide / 4
   Risultato = Miavar >> 2;
   //divide / 8
   Risultato = Miavar >> 3;

Questo metodo non è molto intuitivo ma quando ci troviamo ad ottimizzare il nostro codice per essere eseguito nel minor tempo possibile, lavorare con i bit è sempre una risorsa.