Torna indietro   Hardware Upgrade Forum > Software > Programmazione

GIGABYTE GAMING A16, Raptor Lake e RTX 5060 Laptop insieme per giocare al giusto prezzo
GIGABYTE GAMING A16, Raptor Lake e RTX 5060 Laptop insieme per giocare al giusto prezzo
Il Gigabyte Gaming A16 offre un buon equilibrio tra prestazioni e prezzo: con Core i7-13620H e RTX 5060 Laptop garantisce gaming fluido in Full HD/1440p e supporto DLSS 4. Display 165 Hz reattivo, buona autonomia e raffreddamento efficace; peccano però le USB e la qualità cromatica del pannello. Prezzo: circa 1200€.
iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile
iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile
C'è tanta sostanza nel nuovo smartphone della Mela dedicato ai creator digitali. Nuovo telaio in alluminio, sistema di raffreddamento vapor chamber e tre fotocamere da 48 megapixel: non è un semplice smartphone, ma uno studio di produzione digitale on-the-go
Intel Panther Lake: i processori per i notebook del 2026
Intel Panther Lake: i processori per i notebook del 2026
Panther Lake è il nome in codice della prossima generazione di processori Intel Core Ultra, che vedremo al debutto da inizio 2026 nei notebook e nei sistemi desktop più compatti. Nuovi core, nuove GPU e soprattutto una struttura a tile che vede per la prima volta l'utilizzo della tecnologia produttiva Intel 18A: tanta potenza in più, ma senza perdere in efficienza
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 23-04-2007, 16:59   #1
Very Hard
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
Very Hard è offline   Rispondi citando il messaggio o parte di esso
Old 23-04-2007, 17:33   #2
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da Very Hard Guarda i messaggi
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.
Non serve l'elevamento a potenza.
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%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 23-04-2007, 17:44   #3
Very Hard
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.
Very Hard è offline   Rispondi citando il messaggio o parte di esso
Old 23-04-2007, 18:12   #4
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da Very Hard Guarda i messaggi
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.)...
Non è detto ... dipende. E poi comunque che sia una sequenza di caratteri terminata dal nullo '\0' come inteso in "C" oppure no, cambia poco. Ti basta sapere il numero dei caratteri.
Per fare l'input che funzione hai usato?? fscanf(), fgets(), loop con getchar(), altro???

Quote:
Originariamente inviato da Very Hard Guarda i messaggi
Aggiungo anche che i valori sono interi unsigned a 32 bit
Ok.

Quote:
Originariamente inviato da Very Hard Guarda i messaggi
La funzione che devo implementare è questa:

unsigned int bin2dec(char binstr[32])
Ok ma nota una cosa: quindi in input hai sempre 32 caratteri?? O anche di meno??
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 23-04-2007, 18:12   #5
Black imp
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. se è così andbin ti ha già detto tutto, se no non capisco.
Black imp è offline   Rispondi citando il messaggio o parte di esso
Old 23-04-2007, 18:16   #6
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da Black imp Guarda i messaggi
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. se è così andbin ti ha già detto tutto, se no non capisco.
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%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 23-04-2007, 18:31   #7
Black imp
Senior Member
 
Iscritto dal: Nov 2000
Città: MILANO
Messaggi: 2662
Quote:
Originariamente inviato da andbin Guarda i messaggi
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.
si ok però il problema mi sembra già risolto no? se proprio si vogliono usare le funzioni sulle stringhe si schiaffa l'array in una stringa locale, se no si scandisce l'array - un for da 0 a LUNGARRAY-1 - e, come più o meno hai detto tu, per ogni carattere 0/1 si shifta - il primo shift è ridondante - un long int lo si mette in OR bit a bit con 0x01 o 0x00 in base all'if sul carattere '1' o '0'. se ci sono caratteri diversi si manda l'utente ad arare i campi ...
Black imp è offline   Rispondi citando il messaggio o parte di esso
Old 23-04-2007, 18:45   #8
Very Hard
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.
Very Hard è offline   Rispondi citando il messaggio o parte di esso
Old 23-04-2007, 18:45   #9
71104
Bannato
 
L'Avatar di 71104
 
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;
}
mi sono tenuto sul sicuro nello scrivere la condizione del for perché non ho capito come viene terminata la stringa...
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 23-04-2007, 19:15   #10
maulattu
Senior Member
 
L'Avatar di maulattu
 
Iscritto dal: Mar 2005
Città: ~
Messaggi: 740
Quote:
Originariamente inviato da 71104 Guarda i messaggi
mi sono tenuto sul sicuro nello scrivere la condizione del for perché non ho capito come viene terminata la stringa...
credo con il carattere ASCII 0 --> '\0'
__________________
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
maulattu è offline   Rispondi citando il messaggio o parte di esso
Old 23-04-2007, 19:17   #11
Black imp
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;

}
poi vedi tu se scrivere qualcosa nel caso err==1 o permettere di restituire il risultato parziale. tra l'altro dobbiamo fidarci del fatto che l'array sia inizializzato a zero in precedenza? altrimenti se l'utente mette un numero minore di 32 di caratteri è probabile che poi vengano letti caratteri diversi da 0 e 1 senza che questo sia un errore.

Ultima modifica di Black imp : 23-04-2007 alle 19:20.
Black imp è offline   Rispondi citando il messaggio o parte di esso
Old 23-04-2007, 19:18   #12
Black imp
Senior Member
 
Iscritto dal: Nov 2000
Città: MILANO
Messaggi: 2662
Quote:
Originariamente inviato da maulattu Guarda i messaggi
credo con il carattere ASCII 0 --> '\0'
ma se ha ripetuto 3 volte che non è una stringa!
Black imp è offline   Rispondi citando il messaggio o parte di esso
Old 23-04-2007, 19:57   #13
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da Very Hard Guarda i messaggi
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].
Ok, però voglio fare un appunto: la traccia deve averla scritta sicuramente un pivello .... perdonatemi .... ma uno che chiede di fare una conversione da stringa (e qui per stringa intendo nel modo più generale una sequenza di caratteri) a numero senza poter fare una validazione dei caratteri (perché la funzione non potrebbe segnalare l'errore al chiamate, visto come è dichiarata) e che per di più chiede di fare in modo che il bit meno significativo stia in binstr[0] (a sinistra), non può certamente essere definito diversamente.

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';
}
4 righe nette per bin2dec e 3 per dec2bin .....
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 23-04-2007, 20:02   #14
Very Hard
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
Very Hard è offline   Rispondi citando il messaggio o parte di esso
Old 23-04-2007, 20:26   #15
Very Hard
Member
 
Iscritto dal: Aug 2001
Città: Ferrara
Messaggi: 295
Quote:
Originariamente inviato da andbin Guarda i messaggi
Ok, però voglio fare un appunto: la traccia deve averla scritta sicuramente un pivello .... perdonatemi .... ma uno che chiede di fare una conversione da stringa (e qui per stringa intendo nel modo più generale una sequenza di caratteri) a numero senza poter fare una validazione dei caratteri (perché la funzione non potrebbe segnalare l'errore al chiamate, visto come è dichiarata) e che per di più chiede di fare in modo che il bit meno significativo stia in binstr[0] (a sinistra), non può certamente essere definito diversamente.

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';
}
4 righe nette per bin2dec e 3 per dec2bin .....

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....
Very Hard è offline   Rispondi citando il messaggio o parte di esso
Old 24-04-2007, 08:39   #16
sottovento
Senior Member
 
L'Avatar di sottovento
 
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;
}
Inizializza v prima di usarla.
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 24-04-2007, 11:04   #17
Very Hard
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????
Very Hard è offline   Rispondi citando il messaggio o parte di esso
Old 24-04-2007, 12:00   #18
Black imp
Senior Member
 
Iscritto dal: Nov 2000
Città: MILANO
Messaggi: 2662
Quote:
Originariamente inviato da Very Hard Guarda i messaggi
Ragazzi grazie per le risposte, ma incomincio ad avere un pò di confusione in testa
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.
Black imp è offline   Rispondi citando il messaggio o parte di esso
Old 24-04-2007, 13:56   #19
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da Very Hard Guarda i messaggi
x 71104:

Ho provato il tuo listato ma credo sia sbagliato... mi restituisce sempre l'errore!
l'ho appena testato da me aggiungendo un main e funge; mi fai un esempio di input che gli potrebbe arrivare? questo è il main che gli ho aggiunto:
Codice:
int main()
{
	int Index;
	char Input[32];
	for (Index = 0; Index < 32; Index++)
	{
		Input[Index] = getchar();
	}
	printf("%d\n", bin2dec(Input));
	return 0;
}
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 24-04-2007, 17:25   #20
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da sottovento Guarda i messaggi
Inizializza v prima di usarla.
Assolutamente ragione!
L'inizializzazione l'ho lasciata ..... nella tastiera. (il codice era chiaramente untested).
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


GIGABYTE GAMING A16, Raptor Lake e RTX 5060 Laptop insieme per giocare al giusto prezzo GIGABYTE GAMING A16, Raptor Lake e RTX 5060 Lapt...
iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile iPhone 17 Pro: più di uno smartphone. &Eg...
Intel Panther Lake: i processori per i notebook del 2026 Intel Panther Lake: i processori per i notebook ...
Intel Xeon 6+: è tempo di Clearwater Forest Intel Xeon 6+: è tempo di Clearwater Fore...
4K a 160Hz o Full HD a 320Hz? Titan Army P2712V, a un prezzo molto basso 4K a 160Hz o Full HD a 320Hz? Titan Army P2712V,...
Start Cup Puglia 2025: il 16 ottobre la ...
Incentivi auto elettriche, falsa partenz...
Silence crea anche in Francia una rete d...
La realtà mista al servizio degli...
Nothing ha un altro smartphone in progra...
Decisione storica ad Amburgo: i cittadin...
Questo è il nuovo motore elettric...
HUAWEI WATCH GT 6: lo smartwatch 'infini...
Fotografia con AI: ecco Caira, la macchi...
PlayStation 6 vs Xbox Magnus: il rumor s...
DJI Osmo Action 4 a soli 208€ su Amazon:...
Irion, la data governance diventa strate...
EHang VT35: debutta in Cina il nuovo aer...
Cooler Master MasterLiquid Atmos II 360:...
Trapela in rete la roadmap dei nuovi gio...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 17:48.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v