View Full Version : C Shift
ciao a tutti chi mi saprebbe spiegare il significato di questa riga di codice:
adc_data = (adc_high << 8) | adc_low
dove:
adc_high sono 8 bit
adc_low sono altri 8 bit
adc_data dovrebbe essere di 16 bit dati da adc_high e adc_low
<< dovrebbe essere l'operatore di shift a sinistra??
ciao a tutti chi mi saprebbe spiegare il significato di questa riga di codice:
adc_data = (adc_high << 8) | adc_low
dove:
adc_high sono 8 bit
adc_low sono altri 8 bit
adc_data dovrebbe essere di 16 bit dati da adc_high e adc_low
<< dovrebbe essere l'operatore di shift a sinistra??Esatto. adc_high viene spostato a sinistra di 8 bit e messo poi in OR con adc_low.
Es. adc_high = 0x12, adc_low = 0x34 ---> 0x1200 | 0x34 ---> adc_data = 0x1234.
Esatto. adc_high viene spostato a sinistra di 8 bit e messo poi in OR con adc_low.
Es. adc_high = 0x12, adc_low = 0x34 ---> 0x1200 | 0x34 ---> adc_data = 0x1234.
ma perchè viene usato l'operatore di or(fa la somma dei bit)
Ziosilvio
01-07-2006, 18:32
ma perchè viene usato l'operatore di or(fa la somma dei bit)
L'operatore | (OR bit-a-bit) non fa la somma dei bit, ma in ogni posizione scrive 1 se e solo se almeno uno dei suoi argomenti presenta 1 nella posizione corrispondente.
Ad esempio 5|7 è uguale a 7, perché in binario 5 si scrive 101 e 7 si scrive 111.
Il motivo per cui si usa nel modo che hai visto è che, se a e b sono formati da 8 bit, allora (a<<8)|b contiene una copia di b negli 8 bit meno significativi, e una copia di a negli 8 bit successivi: quindi, puoi "condensare" in una sola variabile il contenuto di altre due.
Si poteva anche scrivere:
adc_data = (adc_high << 8) + adc_low;
e sarebbe stata la stessa cosa.
L'operatore | (OR bit-a-bit) non fa la somma dei bit, ma in ogni posizione scrive 1 se e solo se almeno uno dei suoi argomenti presenta 1 nella posizione corrispondente.
Ad esempio 5|7 è uguale a 7, perché in binario 5 si scrive 101 e 7 si scrive 111.
Il motivo per cui si usa nel modo che hai visto è che, se a e b sono formati da 8 bit, allora (a<<8)|b contiene una copia di b negli 8 bit meno significativi, e una copia di a negli 8 bit successivi: quindi, puoi "condensare" in una sola variabile il contenuto di altre due.
quindi in totale avrò 16 bit?
quindi in totale avrò 16 bit?
vediamo se ho capito......se io scrivo ad esempio
byte_high=00xF8 (equivalente binario 11111000)
byte_low=00x00 (equivalente binario 00000000)
byte_data=(byte_high<<8)|byte_low
a questo punto byte_data dovrebbe essere formato da 16 bit
byte_data=F820(equivalente binario 1111100000100000)
Esatto. adc_high viene spostato a sinistra di 8 bit e messo poi in OR con adc_low.
Es. adc_high = 0x12, adc_low = 0x34 ---> 0x1200 | 0x34 ---> adc_data = 0x1234.
ma l'equivalente binario di 0x1234 è 1001000110100 perchè ci sono due 0 in mezzo?
byte_high=00xF8 (equivalente binario 11111000)
byte_low=00x00 (equivalente binario 00000000)
byte_data=(byte_high<<8)|byte_low
a questo punto byte_data dovrebbe essere formato da 16 bit
byte_data=F820(equivalente binario 1111100000100000)Hai sbagliato a postare ... byte_low=00x00
ma l'equivalente binario di 0x1234 è 1001000110100 perchè ci sono due 0 in mezzo?Scusa, quali 0 in mezzo??? È giusto, comunque: 00010010 00110100
Hai sbagliato a postare ... byte_low=00x00
no nn ho sbagliato a postare metti ad esempio che ho 8 bit 0
Scusa, quali 0 in mezzo??? È giusto, comunque: 00010010 00110100
vediamo se ho capito......se io scrivo ad esempio
byte_high=00xF8 (equivalente binario 11111000)
byte_low=00x00 (equivalente binario 00000000)
byte_data=(byte_high<<8)|byte_low
a questo punto byte_data dovrebbe essere formato da 16 bit
byte_data=F820(equivalente binario 1111100000100000)
byte_high=00xF8 (equivalente binario 11111000)
byte_low=00x00 (equivalente binario 00000000)
byte_data=(byte_high<<8)|byte_low
a questo punto byte_data dovrebbe essere formato da 16 bit
byte_data=F820(equivalente binario 1111100000100000)Ho capitoooooo! Ma perché dovresti avere come risultato F820???? Dove te lo sei inventato quel 2??
Ho capitoooooo! Ma perché dovresti avere come risultato F820???? Dove te lo sei inventato quel 2??
mi sa che mi sono confuso un attimo...
il mio risultato dev'essere contenuto in un registro di 16 bit,ma posso trasmettere un byte alla volta. supponendo che io voglio che il risultato a 16 bit di byte_data=00xF800(equivalente binario 1111100000000000) come devono essere byte_high e byte_low?
mi sa che mi sono confuso un attimo...Nessun problema. ;) Non capivo se avevi sbagliato a scrivere il byte_low o il risultato.
il mio risultato dev'essere contenuto in un registro di 16 bit,ma posso trasmettere un byte alla volta. supponendo che io voglio che il risultato a 16 bit di byte_data=00xF800(equivalente binario 1111100000000000) come devono essere byte_high e byte_low?In che senso come devono essere!?? L'hai appena scritto: il byte high deve essere 11111000 e il low 00000000.
Riassumendo:
per comporre i 16 bit
data = (byte_high << 8) | byte_low;
per scomporre i 16 bit
byte_high = data >> 8;
byte_low = data & 0xFF;
Nessun problema. ;) Non capivo se avevi sbagliato a scrivere il byte_low o il risultato.
In che senso come devono essere!?? L'hai appena scritto: il byte high deve essere 11111000 e il low 00000000.
Riassumendo:
per comporre i 16 bit
data = (byte_high << 8) | byte_low;
per scomporre i 16 bit
byte_high = data >> 8;
byte_low = data & 0xFF;
allora il codice sarà
byte_high=0xF8
byte_low=0x00
byte_data=(byte_high<<8)|byte_low
=>byte_data=0xF800 ?
byte_high=0xF8
byte_low=0x00
byte_data=(byte_high<<8)|byte_low
=>byte_data=0xF800 ?Esatto!
Esatto!
grazie per la tua infinita pazienza
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.