PDA

Visualizza la versione completa : Ancora problema "conversione" valori


gabama
28-06-2009, 12:34
Mi scuso per l' ulteriore fastidio,ma è sorto un ulteriore problema,
se dovessi ad esempio isolare con and un valore come faccio
ad esempio da 0x2f devo "tenere" solo f eliminando 2 e memorizzare,poi devo rifare and e tenere 2 e eliminare f,come si fa?
Ad esempio ho fatto prove con 0x22 e 0x29 e and da 0x20 e or da 2b,ma non afferro il principio di eliminazione .....

YuYevon
28-06-2009, 13:03
Viene semplicemente fatta una AND bit a bit tra il valore iniziale di cui vuoi "estrarre" delle cifre (che chiamiamo A) e un valore numerico che ti serve da "maschera" (come si dice), infatti la rappresentazione binaria di quest'ultimo fa sì che in corrispondenza dei suoi bit posti a 1 venga riportato il corrispondente bit del numero A così com'è (0 se è 0, 1 se è 1) e che i bit in corrispondenza degli 0 vengano invece azzerati (appunto "mascherati") qualunque sia il loro valore (infatti sia 1 AND 0 che 0 AND 0 danno 0 come risultato).

Nel tuo caso hai A che in esadecimale è 0x2f e in binario (su 8 bit) è 00101111. A te interessa "estrarre" i 4 bit più significativi, e per fare questo si fa un AND bit a bit con un numero la cui rappresentazione binaria abbia posti a 1 tutti i 4 bit più significativi e a 0 gli altri, quindi

00101111 /* valore A */
AND /* and bit a bit */
11110000 /* maschera per estrarre i 4 MSB, cioè la prima cifra esadecimale */
=
00100000

come vedi nel risultato, i primi 4 bit (quelli in neretto) sono stati riportati così come erano in A, mentre gli ultimi 4 sono stati azzerati, questo grazie al fatto che la maschera ha posti a 1 i 4 MSB e a 0 i 4 LSB. Se volessi estrarre la seconda cifra esadecimale (o per meglio dire quella "meno significativa", cioè f nel tuo caso) devi fare la stessa operazione ma stavolta la maschera dovrà essere 00001111, cioè dovrà avere i 4 bit posti a 1 in corrispondenza dei 4 LSB.

E' chiaro che la prima maschera sarà (in esadecimale) 0xf0 e la seconda 0x0f... se sai come convertire l'esadecimale in binario è viceversa, è abbastanza banale.

gabama
28-06-2009, 13:48
grazie,ma se dovessi ad esempio fare l' operazione che volevo fare io è impossibile se non mettendo il secondo valore "a mano"

YuYevon
28-06-2009, 16:27
Che intendi? Spiega meglio...

gabama
28-06-2009, 18:23
quello che devo fare è prendere una stringa (problema di ieri) e renderla un intero.Quello che avevo in mente era di estrarre uno a uno i valori ,moltiplicarli per il "peso" e sommarli tra loro

YuYevon
29-06-2009, 08:44
Ma allora... se la cosa è connessa al problema dell'altra volta, quelli che devi estrarre sono caratteri ASCII e non cifre esadecimale... o sbaglio? o-o"

gabama
29-06-2009, 14:21
no,non sbagli,ma sono veramente nei guai,se ho ad esempio una stringa 0x454856 come faccio a isolare a coppie i valori in modo da convertirli nel valore corrispondente?

Eyescream
29-06-2009, 15:24
perchè vuoi estrarli a coppie?

gabama
29-06-2009, 15:35
devo convertire da una stringa di valori in decimale ,come posso fare.....?Pensavo di estrarlo a coppie e moltiplicare

Eyescream
29-06-2009, 16:03
ancora non capisco perchè a coppie e non singolarmente :D
ti conviene fare il cast da char a intero per trovare l'ascii corrispondente e poi lavori su quello, esempio

int conv(char c){
int t = (int) c;
if(t > 47 && t < 58)
return t - 48; // ascii di 0 è 48
if(t > 64 && t < 71)
return t - 55; // ascii di A è 65
if(t > 96 && t < 103)
return t - 87; // ascii di a è 97

}

Loading