PDA

View Full Version : [C++] Chi mi aiuta ad interpretare questo?


Tubo Catodico
09-06-2008, 14:32
Il seguente comando:

rtpHdr |= 0x00800000;

Significa che prendo rtpHdr, ne faccio l'or logico con il valore numerico e poi memorizzo tutto in rtpHdr giusto?
Ma a che scopo? Qual'è il risultato di effettuare un'or con quel valore e che tipo di valore è, non esadecimale ma allora? In pratica a cosa serve questa riga?

Grazie in anticipo!!!!

Volutomitra
09-06-2008, 14:50
Il seguente comando:

rtpHdr |= 0x00800000;

Significa che prendo rtpHdr, ne faccio l'or logico con il valore numerico e poi memorizzo tutto in rtpHdr giusto?
Ma a che scopo? Qual'è il risultato di effettuare un'or con quel valore e che tipo di valore è, non esadecimale ma allora? In pratica a cosa serve questa riga?

Grazie in anticipo!!!!

Supponi che rtpHdr sia un registro ad 8 bit e che ogni bit abbia un significato particolare e che, ad esempio, settando il valore del bit in posizione 0 tu faccia partire un timer mentre resettandolo il timer si fermi. Gli altri 7 bit formeranno una configurazione particolare del registro.

Se tu scrivi:

rptHdr = 0b00000001;

fai partire il timer ma perdi la precedente configurazione di rptHdr.

Se invece scrivi:

rptHdr |= 0b00000001;

fai partire il timer e mantieni la precedente configurazione di rptHdr.

Tubo Catodico
09-06-2008, 14:56
Scusa ma non ti seguo, c'è comunque un'assegnazione quindi il valore di rtpHdr dopo il confronto cambia no?

Volutomitra
09-06-2008, 14:58
Scusa ma non ti seguo, c'è comunque un'assegnazione quindi il valore di rtpHdr dopo il confronto cambia no?

No, non c'è nessun confronto. E' come se tu scrivessi:

rtpHdr = rtpHdr | 0b00000001;

Quindi, se prima rptHdr era uguale a, che ne so, 0b10101000 dopo l'assegnazione sarà uguale a 0b10101001.

EDIT: in pratica "|" equivale a "+" (attenzione al numero di bit, però...)

banryu79
09-06-2008, 15:05
Scusa ma non ti seguo, c'è comunque un'assegnazione quindi il valore di rtpHdr dopo il confronto cambia no?

Il valore della variabile memorizzata in rtpHdr sì.

Il fatto è che se, come già è stato ipotizzato, quella variabile contiene il valore di una maschera di bit, fare l'OR della maschera stessa con il valore desiderato per poi scrivere il risultato sulla maschera stessa sovvrascrivendola serve per mantenere lo stato della maschera così com'era più le modifiche apportate.

Vedila come una serie di interruttori dove tu, nel valore desiderato (l'operando di destra) hai una sequenza di zeri e uno: gli "uno" specificano a quali bit della maschera si vuole cambiare lo stato e, alla fine, la nuova maschera così settata è quella da utilizzarsi.

Tubo Catodico
09-06-2008, 15:10
Il valore della variabile memorizzata in rtpHdr sì.

Il fatto è che se, come già è stato ipotizzato, quella variabile contiene il valore di una maschera di bit, fare l'OR della maschera stessa con il valore desiderato per poi scrivere il risultato sulla maschera stessa sovvrascrivendola serve per mantenere lo stato della maschera così com'era più le modifiche apportate.

Vedila come una serie di interruttori dove tu, nel valore desiderato (l'operando di destra) hai una sequenza di zeri e uno: gli "uno" specificano a quali bit della maschera si vuole cambiare lo stato e, alla fine, la nuova maschera così settata è quella da utilizzarsi.

Ok, perfetto avevo capito così anche io, ma dato che appunto devo modificare il valore di questi flag (tra l'altro avete intuito bene rtpHdr rappresenta una serie di flag) ciò che non capisco è come interpretate il valore 0x00800 ecc.. Non è un esadecimale bene, ma allora come lo devo leggere?

Volutomitra
09-06-2008, 15:19
Non è un esadecimale bene, ma allora come lo devo leggere?

E' un valore esadecimale.

Albi89
09-06-2008, 15:26
Sono 32 bit in esadecimale (c'è 0x) :fagiano:

Tubo Catodico
09-06-2008, 16:20
Grazie !! ;)