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:
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.
Related posts
Articoli popolari
Sorry. No data so far.
.Net micro framework Arduino Arduino Webserver Domotica Flyport I2C IOT Netduino OpenPicus raspberry RTC Speed Test