Riga software sconosciuta

Ciao a tutti! Leggendo un programma su internet per l'utilizzo dell'MPU ho trovato nel software questa riga qua:

AcX=Wire.read()<<8|Wire.read();

Conosco il Wire.read() ma non capisco perche ce ne siano due e a cosa serva il <<8 e |. qualcuno me lo spiega?

Sono calcoli sui bit.
| è l'or dei bit e << uno shift verso sinistra

Prendi il risultato della prima Wire.read(), prendi il secondo risultato della seconda Wire.read(), applichi l'operatore bitwise OR su detto secondo risultato ed il numero 8 (0x10) ed ottieni un nuovo risultato che chiamiamo S. Ora prendi il primo risultato della prima Wire.read() e fai lo shift a sinistra dei bit di S posizioni.

Scritto meglio AxX = (Wire.read() << (8 | Wire.read()) );

Guglielmo

Edit: Vedere la giusta correnzione nel post seguente.

gpb01:
Scritto meglio AxX = (Wire.read() << (8 | Wire.read()) );

Se non sbaglio l'operatore << ha precedenza maggiore di |, quindi la formula sarebbe

AxX = (Wire.read() << 8 ) | Wire.read() ;

Che ha il senso di comporre un valore a 16 bit partendo da due byte ricevuti, sarebbe come scrivere:

AxX = Wire.read()*256 + Wire.read() ;

Ciò non toglie che in qualche caso specifico possa servire anche l'operazione scritta da Guglielmo, ma in quel caso le parentesi sono obbligatorie per modificare la priorità.

Claudio_F:
Se non sbaglio l'operatore << ha precedenza maggiore di |, quindi la formula sarebbe

AxX = (Wire.read() << 8 ) | Wire.read() ;

NON Sbagli affatto :slight_smile: ...
... in effetti ho sbagliato io :smiley: ad esplodere quella formula semplicemente da sinistra verso destra senza pensare alla priorità degli operatori (... tutto preso come ero dal voler spiegare come funzionavano :grin: ) ... lo segnalo nel mio post :wink:

Guglielmo

In genere questa riga serve a riscostruire un intero a 16 bit (uint16_t) partendo da due uint8_t, essendo wire un protocollo che invia e riceve le informazioni byte per byte, quella riga credo stia ritrasformando un intero ricevuto via i2c in 2 byte in un intero! Considera che AcX deve essere di tipo unsigned int perche' il calcolo avvenga correttamente.