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 ...
... in effetti ho sbagliato io ad esplodere quella formula semplicemente da sinistra verso destra senza pensare alla priorità degli operatori (... tutto preso come ero dal voler spiegare come funzionavano ) ... lo segnalo nel mio post
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.