Bitshifting

Ciao a tutti, qualcuno mi può spiegare bitshifting?
Volevo fare una mia "libreria" personale per gli shiftregisters e ho quindi bisogno di ricavare l'MSB da un BYTE. In tutte le pagine che ho trovato su google, si parla di bitshifting ma in ogni caso(neanche qui << - Arduino Reference) non ho capito a cosa mi possa servire...

Grazie mille, Alessandro :smiley:

Il bit shifting, come dice il nome, è lo spostamento dei bit.

L'MSB è il Most Significant Bit, ossia il bit più significativo. Sui micro Atmel è quello più a sinistra.

Grazie per la risposta, prima di tutto :slight_smile:

Il fatto è che questo lo avevo capito, l'ho fatto anche a scuola questo argomento. Il problema è, in modo pratico, come faccio da un byte a trovare l'MSB?

byte primo = B11010100;

//come ottengo 0(l'msb)

Grazie mille ancora per la risposta!

Come ti ho detto, il bit più significativo è quello a sinsitra.
Per "leggerlo" hai 2 modi:

  1. col link che avevi postato tu, arrivi a bitRead: leggi il bit di un byte. Esempio:
if (bitRead(variabile, 7) == 1)

Questo if è valido se il bit in posizione 7, quindi l'ottavo bit (attenzione alle numerazioni, partono da 0), è uguale a 1.

  1. con una operazione di AND per bit:
if (variabile & 0b10000000)

questo test sarà vero solo se l'ottavo bit è pari a 1

Grazie mille per la risposta!

leo72:
Come ti ho detto, il bit più significativo è quello a sinsitra.
Per "leggerlo" hai 2 modi:

  1. col link che avevi postato tu, arrivi a bitRead: leggi il bit di un byte. Esempio:
if (bitRead(variabile, 7) == 1)

Questo if è valido se il bit in posizione 7, quindi l'ottavo bit (attenzione alle numerazioni, partono da 0), è uguale a 1.

Perfetto, già questo basta per la mia applicazione :slight_smile:

leo72:
2) con una operazione di AND per bit:

if (variabile & 0b10000000)

questo test sarà vero solo se l'ottavo bit è pari a 1

Questo invece non l'ho capito, mi sapresti spiegare perche facendo la AND con quel byte dovrebbe darmi true la condizione?

Grazie grazie grazie!

aleale97:
Questo invece non l'ho capito, mi sapresti spiegare perche facendo la AND con quel byte dovrebbe darmi true la condizione?

Prova a pensare a come funziona l'operatore booleano AND ed applicalo a ciò che è tra parentesi ... ricordando che un risultato uguale 0 è FALSE mentre un risultato diverso da 0 è TRUE ... :wink:

Guglielmo

Dunque, correggetemi se sbaglio:

Prendo 8bit di esempio 11011010
Li sommo con 10000000
Ottengo come risultato 00111010

che è diverso da 0, quindi mi restituisce true nonostante il primo bit(a partire da sinistra?-msb) sia 1. Dove sbaglio :expressionless:

No, No, No ... l'operatore AND logico, booleano, non la somma, ... si applica bit a bit :

quindi, prendi il tuo esempio 1 1 0 1 1 0 1 0 e, BIT A BIT, fanne l'AND con 1 0 0 0 0 0 0 0 ... e vedi quanto viene :wink:

Guglielmo

Ricorda i vari operatori logici ...

Guglielmo

Grazie mille! Io facevo and su tutto il byte e quindi facevo in sostanza la somma booleana. Inutile dare le soluzioni che non si capiscono, molto meglio far arrivare alla soluzione, grazie mille ancora :wink:

aleale97:
Inutile dare le soluzioni che non si capiscono, molto meglio far arrivare alla soluzione, grazie mille ancora :wink:

Esatto ... e come vedi ... ci sei facilmente arrivato :wink:

Guglielmo