Problemi di comprensione del codice || e <<

Buongiorno, sto facendo un progetto per l’esame di maturità, cercando di trovare informazioni sul funzionamento di giroscopi e motori mi sono però imbattuto in del codice che non comprendo. Ho conoscenze di c# e le righe seguenti non le ho mai trovate. Qualcuno riesce a spiegarmi come funzionano e a cosa servono i passaggi con :
<< (doppio simbolo del minore) e | (pipe simble, barra verticale)

rz = ((L3GD20_read(0x2D) << 8) | L3GD20_read(0x2C));

rza = ((L3GD20a_read(0x2D) << 8) | L3GD20a_read(0x2C));

il metodo L3GD20_read ha il seguente codice

byte L3GD20_read(byte reg) {
	byte ret = 0;
	digitalWrite(8, LOW);
	SPI.transfer(reg | 0x80);
	ret = SPI.transfer(0);
	digitalWrite(8, HIGH);
	return ret;
}

grazie in anticipo a tutti quanti

Prima di tutto, nella sezione dove avevi messo il post [u]c'è chiaramente scritto[/u], in grassetto, di non postare nulla ... quindi, per favore, la prossima volta presta più attenzione, poi, essendo questo il tuo primo post, ti chiedo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione) e di leggere con attenzione il REGOLAMENTO ... Grazie.

Guglielmo

P.S.: Il tuo post è stato spostato nell'opportuna sezione del forum.

Infine, se aprissi il “reference” troveresti quello che cerchi (in Bitwise Operators)… :smiling_imp:

<< bitshift left

| bitwise or

e così via.

Guglielmo

Quindi, ad esempio, questo:

rz = ((L3GD20_read(0x2D) << 8) | L3GD20_read(0x2C));

significa …
… prendi il risultato della funzione (L3GD20_read(0x2D) e fanne lo shift a sinistra di 8 bit, quindi prendi il risultato di L3GD20_read(0x2C) e fanne l’OR bit a bit con quanto fatto prima e metti il risultato (da 16 bit) in rz.

In pratica, legge la parte alta di un registro, la sposta a sinistra di 8 bit per fare spazio alla parte bassa, legge la parte bassa e la unisce alla parte alta con un OR bit a bit ottenendo così l’intero registro a 16 bit.

E’ una cosa che si fa spesso cone i device I2C che mettono risultati più lunghi di un byte in una serie di registri ad 8 bit.

Guglielmo

gpb01:

rz = ((L3GD20_read(0x2D) << 8) | L3GD20_read(0x2C));

significa …
… prendi il risultato della funzione (L3GD20_read(0x2D) e fanne lo shift a sinistra di 8 bit, quindi prendi il risultato di L3GD20_read(0x2C) e fanne l’OR bit a bit con quanto fatto prima e metti il risultato (da 16 bit) in rz.

In pratica, legge la parte alta di un registro, la sposta a sinistra di 8 bit per fare spazio alla parte bassa, legge la parte bassa e la unisce alla parte alta con un OR bit a bit ottenendo così l’intero registro a 16 bit.

E’ una cosa che si fa spesso con i device I2C che mettono risultati più lunghi di un byte in una serie di registri ad 8 bit.

Guglielmo

In pratica fai L3GD20_read(0x2D) *256 + L3GD20_read(0x2C) solo che con i comandi di bit sei piú veloce perché Ti riferisci direttamente a dei comandi in linguaggio macchina e non a delle funzioni di calcolo aritmetiche.

Ciao Uwe

grazie mille per le risposte. Subito dopo aver postato l'articolo avevo avvisato un moderatore scusandomi del fatto di aver pubblicato nella sezione sbagliata. Avevo già letto cosa facevano i due operatori singolarmente ma non riuscivo il modo in cui lavoravano una volta messi insieme in quanto ho perso la logica di funzionamento dei linguaggi a basso livello. Ancora grazie infinite mi siete stati di enorme aiuto.