|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Aug 2001
Città: Ferrara
Messaggi: 295
|
[C] Da numero binario a decimale
Ciao a tutti...
ho bisogno urgentemente di un vostro aiuto!! ![]() Devo implementare in un programma in C una funzione che mi converta un qualsiasi numero binario inserito dall'utente in un numero decimale. Detto così sembrerebbe facile ma il brutto è che non mi è consentito l’uso della funzione "pow" o di altre funzioni per l’elevamento a potenza. Come posso fare??? ![]() Grazie a chiunque riesca ad aiutarmi |
![]() |
![]() |
![]() |
#2 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Innanzitutto immagino che l'utente inserisca una sequenza di caratteri '0' e '1'. Alla fine dell'input dovresti quindi avere una stringa composta da questi due caratteri. Dichiari una variabile di tipo int o long (dipende da cosa ti serve) inizializzata a zero. Per ogni carattere 0/1 che hai nella stringa, devi prima semplicemente shiftare a sinistra il valore numerico (vedi operatore << ), quindi impostare il bit 0 (il meno significativo) a 0/1 in base alla cifra binaria.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: Aug 2001
Città: Ferrara
Messaggi: 295
|
Prima di tutto ti ringrazio per la risposta...
Allora mi ero dimenticato di dire che il numero inserito dall'utente sono costretto a memorizzarlo in un vettore che non è una stringa di caretteri, quindi, non posso utilizzare su questo vettore le funzioni di manipolazione delle stringhe (strcpy, strcat, ecc.)... Aggiungo anche che i valori sono interi unsigned a 32 bit Avresti qualche altro consiglio da darmi??? La funzione che devo implementare è questa: unsigned int bin2dec(char binstr[32]) Ultima modifica di Very Hard : 23-04-2007 alle 17:49. |
![]() |
![]() |
![]() |
#4 | ||
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Per fare l'input che funzione hai usato?? fscanf(), fgets(), loop con getchar(), altro??? Quote:
Ok ma nota una cosa: quindi in input hai sempre 32 caratteri?? O anche di meno??
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
||
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Nov 2000
Città: MILANO
Messaggi: 2662
|
scusa non capisco: dici che il numero dell'utente NON è memorizzato in un vettore stringa però l'intestazione della funzione che devi implementare riceve proprio un vettore stringa.
![]() |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Il fatto di usare un array di char non necessariamente significa avere una stringa, così come normalmente (come convenzione) è intesa in "C" cioè una sequenza di caratteri terminata dal carattere nullo.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Nov 2000
Città: MILANO
Messaggi: 2662
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
#8 |
Member
Iscritto dal: Aug 2001
Città: Ferrara
Messaggi: 295
|
Allora ho deciso di mettere tutta la traccia per essere più chiaro:
- S'implementino alcune funzioni di conversione tra sistemi di numerazione in varie basi. 1) void dec2bin(unsigned int inp, char binstr[32]) Memorizza la rappresentazione binaria di inp nel vettore binstr. Il bit meno significativo è memorizzato in binstr[0]. I valori di inp sono interi unsigned a 32 bit (ovvero limitati all'intervallo 0…232-1). 2) unsigned int bin2dec(char binstr[32]) Ha come valore di ritorno la rappresentazione decimale di binstr. Il bit meno significativo è memorizzato in binstr[0]. Attenzione! Il vettore di caratteri binstr NON è una stringa di caratteri, perché non è presente il carattere di terminazione ‘\0’. Quindi, non si possono utilizzare su questo vettore le funzioni di manipolazione delle stringhe (strcpy, strcat, ecc.). Qualsiasi implementazione alternativa verrà considerata errata. NON è necessario (quindi altamente SCONSIGLIATO) che l’input dei dati sia INTERATTIVO. Requisiti fondamentali per la realizzazione delle funzioni di conversione: 1) non è consentito l’uso della funzione pow o di altre funzioni per l’elevamento a potenza. 2) la dichiarazione delle funzioni deve rimanere inalterata. 3) la stampa a video del risultato finale deve riportare la posizione delle cifre seguendo l’ordine MSB…LSB. Esempio: dec2bin(4) => 00000000000000000000000000000100 MSB LSB Ultima modifica di Very Hard : 23-04-2007 alle 20:09. |
![]() |
![]() |
![]() |
#9 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
uhm uhm uhm
![]() la mia versione (non testata come al solito ![]() Codice:
unsigned int bin2dec(char binstr[32]) { unsigned int Result = 0; int Index; for (Index = 0; binstr[Index] && (Index < 32); Index++) { Result *= 2; if ('1' == binstr[Index]) { Result++; } else if ('0' != binstr[Index]) { printf("errore fatale nel subsystem Win32 causato dal kernel che pero' non riesce a mostrare la schermata blu perche' il codice che la mostra e' corrotto: l'utente e' andato ad arare.\n"); return (unsigned int)-1; } } return Result; } ![]() |
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: Mar 2005
Città: ~
Messaggi: 740
|
Quote:
![]()
__________________
Ciao ciao cagnolino Billy ![]() ![]() ![]() MacMini late 2009, 2.53GHz, 4GB ram, 320GB hard disk, Snow Leopard 10.8.2 - iPod Nano 6th gen. XBOX Live GamerTag: InsaneMau |
|
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Nov 2000
Città: MILANO
Messaggi: 2662
|
Codice:
unsigned int bin2dec( char binstr[32] ) { unsigned long int pippo=0; int i; int err=0; for (i=0; i<32 && !err; i++) { pippo<<=1; if ((binstr[i]-'0')==1) pippo|=0x01; else if ((binstr[i]-'0')==0) ; else err=1; } return pippo; } Ultima modifica di Black imp : 23-04-2007 alle 19:20. |
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Nov 2000
Città: MILANO
Messaggi: 2662
|
|
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
![]() Ecco una possibile implementazione: Codice:
unsigned int bin2dec(char binstr[32]) { unsigned int v, i; for (i = 0; i < 32; i++) v = v << 1 | (binstr[31-i] == '1'); return v; } void dec2bin(unsigned int inp, char binstr[32]) { int i; for (i = 0; i < 32; i++, inp >>= 1) binstr[i] = (inp & 1) + '0'; }
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#14 |
Member
Iscritto dal: Aug 2001
Città: Ferrara
Messaggi: 295
|
Ragazzi grazie per le risposte, ma incomincio ad avere un pò di confusione in testa
![]() ![]() x 71104: Ho provato il tuo listato ma credo sia sbagliato... mi restituisce sempre l'errore! x Black imp: Si l'array inizialmente viene inizializzato a 0... ma come posso fare l'input?? Va bene anche non interattivo! Comunque il tuo listato dovrebbe funzionare sicuramente?? Io l'ho provato ma quando vado in stampa mi restituisce sempre un valore diverso... mah credo che l'errore sia mio, forse nel printf ![]() |
![]() |
![]() |
![]() |
#15 | |
Member
Iscritto dal: Aug 2001
Città: Ferrara
Messaggi: 295
|
Quote:
Andbin io il primo punto l'avevo fatto così: Codice:
void dec2bin(unsigned int inp, char binstr[32]) { i=0; while(i<32) { if((inp%2)==0) { binstr[32-1-i]=0; } else { binstr[32-1-i]=1; } inp=inp/2; ++i; } } La tua al momento ho provato solo da decimale a binario e mi restituisce numeri sballati... se preferisci ti posto tutto il listato incluso il main così magari mi saprai dire sicuramente dove sbaglio.... |
|
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
[quote=andbin;16856195]Ecco una possibile implementazione:
Codice:
unsigned int bin2dec(char binstr[32]) { unsigned int v, i; for (i = 0; i < 32; i++) v = v << 1 | (binstr[31-i] == '1'); return v; }
__________________
In God we trust; all others bring data |
![]() |
![]() |
![]() |
#17 |
Member
Iscritto dal: Aug 2001
Città: Ferrara
Messaggi: 295
|
Cosa sbaglio???
![]() ![]() ![]() Codice:
#include<stdio.h> #define BIT 32 void dec2bin(unsigned int inp, char binstr[32]); unsigned int bin2dec(char binstr[32]); int i,j; int b; char binstr[BIT]; int main() { for(i=0;i<BIT;i++) { binstr[i]=0; } printf("Numero decimale: "); scanf("%d",&b); dec2bin(b,binstr); for(j=0;j<BIT;j++) { printf("%d ",binstr[j]); } for(i=0;i<BIT;i++) { binstr[i]=0; } printf("\nNumero binario: "); scanf("%d",&binstr); bin2dec(binstr); printf("%d ",binstr); printf("\n"); } void dec2bin(unsigned int inp, char binstr[32]) { i=0; while(i<BIT) { if((inp%2)==0) { binstr[BIT-1-i]=0; } else { binstr[BIT-1-i]=1; } inp=inp/2; ++i; } } unsigned int bin2dec(char binstr[32]) { int i; unsigned int val; for(i=0;i<32;i++); if(binstr[i]=='1') val |= 1<<i; return val; } Qualsiasi "bin2dec" delle vostre che vado a sostituire non mi restituisce mai il numero decimale.... sbaglio nella visualizzazione???? |
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: Nov 2000
Città: MILANO
Messaggi: 2662
|
vuole dire che quando leggi il numero non inverti la posizione dei caratteri. guarda che se il bit meno significativo deve stare in posizione 0 vuol dire che se il numero messo dall'utente è 1101 lo devi memorizzare come 1011 nell'array.
|
![]() |
![]() |
![]() |
#19 | |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
Codice:
int main() { int Index; char Input[32]; for (Index = 0; Index < 32; Index++) { Input[Index] = getchar(); } printf("%d\n", bin2dec(Input)); return 0; } |
|
![]() |
![]() |
![]() |
#20 |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Assolutamente ragione!
L'inizializzazione l'ho lasciata ..... nella tastiera. ![]()
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:48.