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
248 11111000
240 11110000
224 11100000
192 11000000
128 10000000
0 00000000

Il codice che esegue quanto detto è il seguente

[c]
//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);

}

[/c]

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:

127 01111111
63 00111111
31 00011111
15 00001111
7 00000111
3 00000011
1 00000001
0 00000000

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:

[c]
MiaVar = MiaVar << 4;
[/c]

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:

[c]
//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;
[/c]

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.