Newsgroup: it.comp.lang.c
Titolo: Efficenza codice

Sono appena entrato nel mondo della programmazione c, ma penso che
questa possa essere comunque una sfida.
Ho creato questa funzione per convertire da decimale in binario:
______________________
int bin(int num) { 
    int x = 0, molt;
    for(molt = 1, x = num % 2; num / 2 != 0; molt *= 10, num /= 2) {
        if (num%2 && molt!=1)
            x += (num % 2) * molt;
    }
    if (molt!=1)
        x += (num % 2) * molt; 
    return x; 
}
______________________
l'ho rifinita un po' e alla fine mi sono accorto che poteva essere
riassunta in questo:
______________________
int bin(int num) {
    int nbin = 0, molt = 1;
    for( ; num != 0; molt *= 10, num /= 2) if (num%2) nbin += molt;    
    return nbin;
}
______________________
con mia grande sorpresa mi sono accorto che la prima funzione va piů
veloce della prima!!! anche se di poco ma č cosě.
Ho un PPC G4 733mhz con MAC OS X 10.3
ho registrato questa differenza con Sampler, il programma integrato con
XCode.

 int bin(int num) {
Questa funzione non converte da decimale in binario, ne tantomeno stampa un
numero in formato binario....
La funzione prende un intero num e restituisce un intero composto da sole
cifre binarie, si ma....
Se io ti do un numero "grande" il tuo algoritmo non sara' mai in grado di
funzionare!
(se hai int a 32 bits, ad esempio, puoi avere numeri fino a 10 cifre di
precisioni decimali, ma questi corrispondono a numeri a 32 cifre di
precisione binara!)
Detto questo so che se fai:
printf("%d",bin(9));
otterrai 1001, un risultato che sembra correttto. Se hai numeri a 32 bits,
prova a fare bin(1750238540) ad esempio! Questo e' un in valido, e
corrisponde a: 1101000010100101000010101001100 , ma il tuo algoritmo stampa:
967936908 che oltre che non avere abbastanza precisione (invece di avere 31
cifre ne ha solo 9), non e' nemmeno binario!
Questo ti fa capire che quando da 9 ottieni -> 1001 in realta' tu non
ottieni il valore 1001 in base due, ma mille-e-uno in decimale.
Quindi in pratica credo che tu debba proprio pensare a qualche cosa di
completamente diverso.
Tra le altre cose tieni presente che 9 decimale, dentro il computer e' gia'
rappresentato in binario come 1001.
Quando tu trasformi 9 in 1001 (in base 10), ora il computer tiene la
rappresentazione binaria del valore decimale 1001 ovvero: 1111101001
Quindi .....
Un algoritmo molto migliore sarebbe quello di leggere direttamente la
rappresentazione interna del numero! Se il numero, all'interno del computer
e' gia' decimale, perche' mai convertirlo !?!?
Tommy

 e' gia' decimale, perche' mai convertirlo !?!?
... e' gia' binario......
(invece che decimale).
Tommy

Lo so bene come funziona il mio programma, non era questa la domanda.
Io parlavo della velocità della funzione.

 ottieni il valore 1001 in base due, ma mille-e-uno in decimale.
E' ovvio che se ho scritto una funzione del genere so benissimo cosa
restituisce la funzione!!!! L'ho creata appositamente per immagazzinare
decimali. Infatti il programma completo compone prima la cifra
dell'argomento in numeri da 127 e poi li affianca semplicemente
separati da uno spazio. So bene come funziona un calcolatore
all'interno!!
La cosa che mi stupisce è la velocità della funzione + lunga e meno
rifinita. Tutto qui!!!

 Io parlavo della velocità della funzione.
Beh, la "velocita'" e' l'ultima cosa da considerare, specialmente quando hai
un algoritmo di questo tipo.
Ad ogni modo, se sai come funziona il tuo programma, potevi allora scriverne
uno piu' sensato ;-)
Detto questo, veniamo la tua domanda sulla velocita':
"con mia grande sorpresa mi sono accorto che
" la prima funzione va più veloce della prima!!!"
Mi spieghi cosa vuole dire questa frase?!
E' la seconda piu' veloce della prima, o la prima piu' veloce della seconda?
Per finire in tutto il post non c'e' nessuna domanda. Se volevi sapere il
perche' potevi fare tale domanda.... ..
Tommy

 ha scritto nel messaggio
news:101120032148230848%gurghet...@virgilio.it...


 XCode.
Premetto che gli ho dato solo un'ochhiata molto veloce, ma cosi' al volo 
mi pare di aver visto che la seconda funzione (quella piu' rifinita) in 
realta' fa il doppio dei cicli (num != 0 invece di num/2 != 0), quindi 
e' logico che in generale sia piu' lenta.
Mi sbaglio ?
Ciao,
Stefano.

Grazie mille a tutti

ecco cosa mi sfuggiva!!!
grande!!!
cmq rispondo anche a tommy: lo so che non ha molto senso cosě da sola
ma ha + che altro uno scopo didattico. OK?
Un grazie anche a Giuseppe.
