PDA

Visualizza la versione completa : [C] Da decimale a binario


darksergio
07-10-2011, 20:15
salve, ho scritto questo programma, ma in output non ottengo il risultato corretto, ad esempio inserendo come numero 8 ottengo 100 quando dovrebbe essere 1000, cioè è come se il programma "saltasse" un iterazione qualcuno saprebbe dirmi come mai?
sono convinto si tratti di una sciocchezza, ma purtroppo non risco a trovarla :nonlodire




#include <stdio.h>
#include <stdlib.h>
#define size (sizeof(int)*8)

int* dec_bin(int);

int main()
{
int n,*p,i;
printf("inserire numero decimale da convertire: ");
scanf("%d",&n);
p=dec_bin(n);
printf("risultato: ");
for(i=0;i<size;i++)
printf("%d",p[i]);
return 0;
}

int* dec_bin(n)
{
int i,*p;
n=n+1;
i=size;
p=(int*)calloc(size,sizeof(int));

if(p != NULL)
{
while(i>0 && n!=0)
{
if(n%2!=0)
p[i]=1;
n=n/2;
i--;
printf("%d ",n);
}
}
return p;
}

oregon
07-10-2011, 20:33
Non mi è chiaro il metodo che usi nella funzione dec_bin per convertire il valore.

Non capisco perché lo aumenti di 1 con

n=n+1;

E se ci fai caso, i parte da 32 mentre saprai che gli elementi del vettore vanno da 0 a 31 ...

Se fai un po' di debugging (o usi delle printf per controllare le variabili) ti accorgi che c'è qualcosa che non va ...

darksergio
07-10-2011, 20:39
n=n+1 era una prova, l'ho già tolto, comunque è vero, non avevo consideranto che dandogli il size non avrebbe corrisposto con gli elementi dell'array, errore di distrazione, che vuoi farci la stanchezza :fagiano:

risolto, il programma funzionante è...




#include <stdio.h>
#include <stdlib.h>
#define size (sizeof(int)*8)

int* dec_bin(int);

int main()
{
int n,*p,i;
printf("inserire numero decimale da convertire: ");
scanf("%d",&n);
p=dec_bin(n);
printf("risultato: ");
for(i=0;i<size;i++)
printf("%d",p[i]);
return 0;
}

int* dec_bin(n)
{
int i,*p;
i=size-1;
p=(int*)calloc(size,sizeof(int));

if(p != NULL)
{
while(i>0 && n!=0)
{
if(n%2!=0)
p[i]=1;
n=n/2;
i--;
}
}
return p;
}


grazie :D

darksergio
07-10-2011, 20:42
piuttosto sarebbe possibile strutturare questa funzione con gli operatori bitwise?

oregon
07-10-2011, 20:44
Originariamente inviato da darksergio
piuttosto sarebbe possibile strutturare questa funzione con gli operatori bitwise?

Cioè ?

darksergio
07-10-2011, 20:48
niente, visto che ho creato questa funzione per implementarla negli esercizi in cui mi verrà chiesto di estrarre i bit per farci determinate operazioni, mi chiedevo se fosse possibile riscrivere la funzione utilizzando gli operatori bitwise per svolgere l'estrapolazione invece del metodo delle divisioni ripetute, così giusto per mettere il codice più in linea con l'argomento

oregon
07-10-2011, 20:51
Ok ... al posto delle divisioni, esegui una AND del valore da convertire con un altro valore (maschera) che ha il bit da testare a 1 e tutti gli altri a 0.

Per cominciare, utilizzerai il valore 1 come maschera, poi diventerà 2, poi 4 ...

darksergio
07-10-2011, 21:10
dovrebbe essere qualcosa del genere, ovviamente invece degli uno, nelle posizione apposite ci sono i resti, ma sono dettagli xD



#include <stdio.h>
#include <stdlib.h>
#define size (sizeof(int)*8)

int* dec_bin(int);

int main()
{
int n,*p,i;
printf("inserire numero decimale da convertire: ");
scanf("%d",&n);
p=dec_bin(n);
printf("risultato: ");
for(i=0;i<size;i++)
printf("%d",p[i]);
return 0;
}

int* dec_bin(n)
{
int i,*p,m=1;
i=size-1;
p=(int*)calloc(size,sizeof(int));

if(p != NULL)
{
while(i>0 && m<=0)
{
p[i]=n&m;
m=m<<1;
i--;
}
}
return p;
}


dove sto sbagliando?

oregon
07-10-2011, 21:20
E' un po' criptico, ma potrebbe essere

p[i]=!!(n&m);


p.s. ricordati che deve essere int* dec_bin(int n)

darksergio
07-10-2011, 21:22
io ho pensato a

p[i](n&m)/m;

che ne pensi?

forse è meno drastico...

Loading