Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Conversione binario->stringa di decimali(numeri molto grandi)
Forum - C/C++ - Conversione binario->stringa di decimali(numeri molto grandi)

Avatar
quello che non so come si chiama (Normal User)
Rookie


Messaggi: 37
Iscritto: 08/01/2013

Segnala al moderatore
Postato alle 9:56
Giovedì, 21/02/2013
Buongiorno, so che il titolo è molto brutto, per cui vado subito a spiegarmi meglio:
Mi sono fatto una classe utile a gestire i numeri naturali, con una capacità di immagazinare (2**((2**(8*sizeof(size_t))-1))-1) numeri, chiaramente facendo i calcoli con operatori bitwise. Per cui, per esempio, potrei avere in memoria un numero del tipo 10100101 10101101 00100101 10000001 11111101 10100100 00000001 00100001 11100111 00011010 (giusto per dire un numero a caso che non può stare in nessun tipo nativo).
Siccome mi è impossibile rilevarmi il valore decimale di questo numero(utilizzando il metodo classico), visto che dovrei arrivare a fare operazioni oltre il 2**70 che andrebbero in overflow anche negli unsigned __int64, mi chiedevo se esisteva un altro metodo per determinarmi il valore decimale di ogni singolo char da stampare a schermo. Probabilmente, ma è solo una mia idea, funzioni come printf utilizzaranno un algoritmo simile a quello che serve a me per estrapolarsi dai bytes dei vari int, unsigned int, ecc... i valori decimali delle singole cifre da stampare su schermo, altrimenti non saprei come possano fare...
Avete qualche idea? Grazie.

PS: Chiaramente con "**" intendo l'elevamento a potenza

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 950
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 10:30
Giovedì, 21/02/2013
Ciao!

Certamente non si possono utilizzare le funzioni tradizionali. Quindi bisogna implementare un metodo apposito.
Come hai definito la classe?


Nulla va più veloce della luce, quindi rilassati.
PM Quote
Avatar
quello che non so come si chiama (Normal User)
Rookie


Messaggi: 37
Iscritto: 08/01/2013

Segnala al moderatore
Postato alle 10:52
Giovedì, 21/02/2013
Se intendi in che maniera mi mantengo in memoria i dati, ho all'interno della classe un puntatore a carattere che punta al byte più significativo e un campo size_t che mi dice la dimensione in byte del numero, ovvero, per esempio se ho in memoria il numero 10000000 01101011, messo per esempio in questi indirizzi:

0x0093123c 0x0093123d
10000000    01101011

il puntatore a char è valorizzato con 0x0093123c e la dimensione è 2.
Chiaramente quando faccio un'operazione e con qualche controllo valuto se è possibile che dovrò aumentare la dimensione alloco un byte in più e il numero precedente sarà immagazzinato così:
0x00161a31 0x00161a32 0x00161a33
00000000    10000000    01101011

Spero di aver capito bene la tua domanda...

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 950
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 11:41
Giovedì, 21/02/2013
Se non ho capito male, dal punto di vista logico, tu rappresenti il numero con base 256.
Questo semplifica le cose se devi convertirlo in base 16 o binaria ( basta raggruppare le cifre ) .
Una soluzione per semplificare i conti è quella di utilizzare 100 come base, ma ovviamente hai lo svantaggio di sprecare  memoria.


Nulla va più veloce della luce, quindi rilassati.
PM Quote
Avatar
quello che non so come si chiama (Normal User)
Rookie


Messaggi: 37
Iscritto: 08/01/2013

Segnala al moderatore
Postato alle 12:07
Giovedì, 21/02/2013
Mi sono spiegato male, utilizzo una rappresentazione binaria per i numeri, quei vari 0x0093123c, 0x00161a32 ecc. erano degli ipotetici indirizzi di memoria nei quali si trovano memorizzati dei "pezzi" di numero, nel caso del numero binario 10000000 01101011, avevo nell' indirizzo 0x0093123c la parte 10000000, mentre nell'indirizzo successivo, ovvero, 0x0093123d avevo memorizzato 01101011.

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 950
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 14:05
Giovedì, 21/02/2013
Ogni pezzo di numero lo memorizzi su un puntatore char. Quest' ultimo occupa 1 byte e può rappresentare un numero intero  che va da -128 a 127


Nulla va più veloce della luce, quindi rilassati.
PM Quote
Avatar
quello che non so come si chiama (Normal User)
Rookie


Messaggi: 37
Iscritto: 08/01/2013

Segnala al moderatore
Postato alle 14:44
Giovedì, 21/02/2013
Il puntatore a char punta al byte più significativo, in base al numero che devo contenere, malloco i bytes che mi servono. Per cui il numero da memorizzare è scritto in binario in un array di char, quindi, preso da solo uno di questi char non mi vuole dire niente. L'utilizzo del puntatore a char è soltanto per i vari pointer+1 o pointer-1 che fanno variare di soltanto un byte la posizione puntata.
Per esempio, in un blocco di 2 bytes, allocato partendo da 0x00000010, il valore assegnato al char* sarà 0x00000010, mentre la dimensione sarà 2.
Utilizzando un po' di fantasia, mettiamo che il puntatore si chiami "puntatore", per cui puntatore&128(ovvero 0b10000000) è il bit più significativo, mentre (puntatore+1)&1(0b00000001) è il bit meno significativo...

PM Quote