Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    760

    Ancora problema "conversione" valori

    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 .....

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    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.
    every day above ground is a good one

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    760
    grazie,ma se dovessi ad esempio fare l' operazione che volevo fare io è impossibile se non mettendo il secondo valore "a mano"

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Che intendi? Spiega meglio...
    every day above ground is a good one

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    760
    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

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    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"
    every day above ground is a good one

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    760
    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?

  8. #8
    perchè vuoi estrarli a coppie?

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    760
    devo convertire da una stringa di valori in decimale ,come posso fare.....?Pensavo di estrarlo a coppie e moltiplicare

  10. #10
    ancora non capisco perchè a coppie e non singolarmente
    ti conviene fare il cast da char a intero per trovare l'ascii corrispondente e poi lavori su quello, esempio
    codice:
    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
    	
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.