Conversione da binario a decimale

di il
8 risposte

Conversione da binario a decimale

Salve a tutti ragazzi, sono un ragazzo iscritto ad Ingegneria Gestionale della Logistica e della Produzione alla Federico II di Napoli e sto studiando per l'esame di Elementi di Informatica, in cui c'è una parte di programmazione in C++.

Mi sto un po' esercitando ed ho incontrato un problema con questo esercizio:
Sviluppare un programma che chieda all'utente di inserire un codice binario ad L cifre, con L scelto dall'utente; inoltre deve poter stampare il codice binario inserito e deve poter calcolare il numero decimale corrispondente e stamparlo a video.

Fino ad ora ho scritto questo, poi mi sono bloccato:
#include <iostream>
#include <math.h>
using namespace std;

#define NMAX 10000000

int LunghezzaNumeroBinario;
int i;
int VettoreBinario[NMAX];
int CorrispondenteNumeroDecimale;
int a;

int main (){
	
	cout << "Inserire la lunghezza del numero binario che si vuol trasformare in decimale:" << endl;
	cin >> LunghezzaNumeroBinario;
	
	for (i=1; i<=LunghezzaNumeroBinario; i++){
		cout << "Inserire il bit:";
		cin >> VettoreBinario[i];
	}
	
	cout << "Il numero binario inserito e'':" << endl;
	for (i=1
; i<=LunghezzaNumeroBinario; i++){
	    cout << VettoreBinario[i];
	 }
	 
	cout << endl;
	 	
return 0;
}
Quindi mi manca la funzione contenente l'algoritmo che permette la conversione del binario inserito nel numero decimale ad esso relativo. Come posso continuare? Vi ringrazio.

8 Risposte

  • Re: Conversione da binario a decimale

    Come avviene la conversione (sulla carta) ?
  • Re: Conversione da binario a decimale

    La conversione ''manuale'' avviene con una sommatoria di potenze di 2 in base alla posizione in cui si trova il bit.
    Infatti avevo pensato di sviluppare una variabile (chiamarla, ad esempio, NumeroDecimale) e porla in sommatoria (quindi utilizzando "+=") ad powf (2, i) all'interno di un ciclo for, con i che è la posizione, volta per volta del bit.

    Cosa ne pensate ?
  • Re: Conversione da binario a decimale

    Prova e vediamo
  • Re: Conversione da binario a decimale

    Io ho fatto un convertitore decimale-binario, binario-decimale e anche qualcosa sull'esadecimale in ruby e ho usati ovviamente il metodo che si usa su carta. Poi ho scoperto che in ruby basta scrivere numero.to_i(2) e ti trasforma un numero, nel numero in base 2 (o 3 o 4 o tutti i numeri che si vuole fino a 36 mi sembra)
    Comunque basta fare la stessa cosa che usi sulla carta
  • Re: Conversione da binario a decimale

    oregon ha scritto:


    Prova e vediamo
    Ho provato con questo algoritmo dato da ciclo for:
    	for (i=1; i<=LunghezzaNumeroBinario; i++){ 
            a = powf (2, VettoreBinario[i]);
            }
            int CorrispondenteNumeroDecimale;
    		CorrispondenteNumeroDecimale += a;
            cout << "Il corrispondente numero decimale e':'"<< CorrispondenteNumeroDecimale;
    Ma non va bene. Ho provato anche con:
    	for (i=1; i<=LunghezzaNumeroBinario; i++){ 
            a = powf (2, VettoreBinario[i]);
            
            int CorrispondenteNumeroDecimale;
    		CorrispondenteNumeroDecimale += a;
            cout << "Il corrispondente numero decimale e':'"<< CorrispondenteNumeroDecimale;
            }
    Ma nemmeno va bene. Sono abbastanza certo che il cout va fuori il ciclo for, sennò invece di leggermi una sommatoria mi da un valore diverso per ogni giro del ciclo for sulla singola posizione.

    In cosa sbaglio ?
    Credo di doverlo mettere in ciclo for perché mi serve che vada a 'sfogliare' tutte le posizioni i volta per volta.
    Solo che forse sbaglio nel powf ?
  • Re: Conversione da binario a decimale

    Pittella ha scritto:


    oregon ha scritto:


    Prova e vediamo
    Ho provato con questo algoritmo dato da ciclo for:
    	for (i=1; i<=LunghezzaNumeroBinario; i++){ 
            a = powf (2, VettoreBinario[i]);
            }
            int CorrispondenteNumeroDecimale;
    		CorrispondenteNumeroDecimale += a;
            cout << "Il corrispondente numero decimale e':'"<< CorrispondenteNumeroDecimale;
    Ma non va bene. Ho provato anche con:
    	for (i=1; i<=LunghezzaNumeroBinario; i++){ 
            a = powf (2, VettoreBinario[i]);
            
            int CorrispondenteNumeroDecimale;
    		CorrispondenteNumeroDecimale += a;
            cout << "Il corrispondente numero decimale e':'"<< CorrispondenteNumeroDecimale;
            }
    Ma nemmeno va bene. Sono abbastanza certo che il cout va fuori il ciclo for, sennò invece di leggermi una sommatoria mi da un valore diverso per ogni giro del ciclo for sulla singola posizione.

    In cosa sbaglio ?
    Credo di doverlo mettere in ciclo for perché mi serve che vada a 'sfogliare' tutte le posizioni i volta per volta.
    Solo che forse sbaglio nel powf ?
    Prima di tutto non so cosa faccia powf() ma credo che sia come pow(), comunque posso dirti che in entrambi i codici sbagli a elevare il numero, perché l'1 o lo 0 vanno moltiplicati per 2^posizione. Inoltre il CorrispondenteNumeroDecimale devi aumentarlo in ogni ciclo, non solo alla fine. Poi se ho vben capito il for, ti posso dire che salti lo zero, e inoltre se non sbaglio il binario va letto al contrario. Se vuoi posso mandarti la funzione che ho fatto io, funzionante, ma usa il binario sotto forma di stringa, inoltre ho usato altre funzioni quindi è completamente differente dal tuo modo
  • Re: Conversione da binario a decimale

    Quindi il valore a dovrebbe essere dato da:
    VettoreBinario * pow(2, i)
    ovvero il singolo bit moltiplicato per 2 elevato ad i, con che è la posizione.
    Tutto ciò dovrei prenderlo in sommatoria al variare di i da 0 a N-1, con N cardinalità del vettore binario.

    Cosa ne pensi?
    Il fatto che il vettore binario andrebbe preso al contrario potrei svilupparlo nel ciclo for, partendo da N-1 e andando verso 0, quindi con un decremento dell'elemento i.
  • Re: Conversione da binario a decimale

    Si ma così sbaglieresti pure l'elevazione a Potenza. Io per risolvere ho creato una funzione chiamata reverse, e già dal nome si capisce cosa fa, che prende in entrata una String e ne restituisce la stringa al contrario. Ovviamente questo serve soltanto se nella funzione di conversione usi una stringa tipo "11011011010". A quel punto gli dici stringa=reverse(stringa) e allora hai fatto. Il ritorno è "01011011011" e allora la leggi bene, accordando sia l'indice che l'elevazione a Potenza. Sarà quindi numero+=stringa*pow (2,i)
Devi accedere o registrarti per scrivere nel forum
8 risposte