Conversione da binario a decimale

di il
9 risposte

Conversione da binario a decimale

Ciao a tutti ho un problema con un programma in c++ per la conversione da binario a decimale. in pratica funziona solo con alcuni numeri mentre con altri il risultato è errato.

dovè che sbaglio?
#include <iostream>
#include <math.h>
using namespace std;

int main(){
    //Dichiarazione delle variabili
    int binario,
         cifra;
    //Definizione delle variabili
    int decimale = 0,
         numeroCifre = 0;
    //Prompt
    cout << "\nInserisci un numero binario: ";
    cin >> binario;
    //Rilevazione numero cifre
    while( static_cast< int >( binario / pow( 10, numeroCifre ) ) != 0 )
       ++numeroCifre;
    //Conversione da binario a decimale
    for( int i = numeroCifre - 1; i >= 0; --i ){
         cifra = static_cast< int >( binario / pow( 10, i ) ) % 10;
         decimale += ( cifra * static_cast< int >( pow( 2, i ) ) );
    } 
    //Visualizzazione del risultato
    cout << "\nIl corrispondente numero decimale e': " << decimale << endl;
    system( "PAUSE" );
    return 0;
}

9 Risposte

  • Re: Conversione da binario a decimale

    Ciao fzocch04
    Strano simpatico sistema che hai usato Comunque mi sembra che funzioni! con che numeri sbaglia? (non puoi usare numeri troppo grandi al massimo 10 cifre altrimenti non entrano in un intero).
  • Re: Conversione da binario a decimale

    Se l'input binario è quello del tipo '100010010010010' e devi trovare il corrispondente numero decimale, consiglio allora di ricavare la 'stringa' binaria per poi operare su di essa fino a quando non è finita. un esempio:
    
    #include <cstring>
    #include <cmath>
    
    void BinToDec(const string &src, int &dst){
        dst=0;
        int len = src.size() - 1;
        for(int i=len;i>=0;i--)
            if(src[i]=='1') dst += (int)pow(2.0,len-i);
    }
    
    Ricordo che il tipo 'int' è rappresentato su 4byte, quindi in totale un 'int' può rappresentare 2^32 - 1 valori (da 0 a 4294967296 se 'unsigned' , da -2147483648 a 2147483647 se 'signed' ), per cui attenzione sull'input.
  • Re: Conversione da binario a decimale

    Mi è stato espressamente richiesto di utilizzare il tipo INT, il problema mi si verifica quando in input do il numero binario 10000,perché mi da come risultato 20. Credo che il problema sia sul calcolo della singola cifra.
     cifra = static_cast< int >( binario / pow( 10, i ) ) % 10;
  • Re: Conversione da binario a decimale

    Ciao fzocch04,
    il problema sul binario 10000 non mi è riscontrabile, il tuo codice mi restituisce 16 in esecuzione. Un'altra soluzione potrebbe essere:
    
       ...
       for (decimale=0,e=1;binario;binario/=10,e<<=1)
          if (binario%2)	
             decimale|=e;
       ...
    
  • Re: Conversione da binario a decimale

    Vi posto i risultati del programma per i numeri da uno a 50. Sulla carta funziona ma quando lo eseguo il risultato è questo:
    0 = 0
    1 = 1
    10 = 2
    11 = 3
    100 = 4
    101 = 5
    110 = 6
    111 = 7
    1000 = 0
    1001 = 9
    1010 = 10
    1011 = 11
    1100 = 12
    1101 = 13
    1110 = 14
    1111 = 15
    10000 = 88
    10001 = 17
    10010 = 18
    10011 = 19
    10100 = 20
    10101 = 21
    10110 = 22
    10111 = 23
    11000 = 16
    11001 = 25
    11010 = 26
    11011 = 27
    11100 = 28
    11101 = 29
    11110 = 30
    11111 = 31
    100000 = 72
    100001 = 33
    100010 = 34
    100011 = 35
    100100 = 36
    100101 = 37
    100110 = 38
    100111 = 39
    101000 = 32
    101001 = 41
    101010 = 42
    101011 = 43
    101100 = 44
    101101 = 45
    101110 = 46
    101111 = 47
    110000 = 120
    110001 = 49
    110010 = 50

    Sarà una coincidenza ma il problema mi si verifica solo con i multipli di 8!!!
    Il problema deve verificarsi quando cerca di ricavare la quarta cifra da destra del numero binario.
    Aiutatemi, sto andando al manicomio.
  • Re: Conversione da binario a decimale

    ixamit ha scritto:


    Un'altra soluzione potrebbe essere:
    
       ...
       for (decimale=0,e=1;binario;binario/=10,e<<=1)
          if (binario%2)	
             decimale|=e;
       ...
    
    ciao ixamit,
    è sempre un piacere vedere delle chicche del genere!

    Giusto per diverimento posto una variante:
    
       for (decimale=0,e=1; binario; binario/=10,e*=2)
          decimale += e*(binario%2);
    
    @fzocch04
    Guarda che il tuo codice così come lo hai postato funziona perfettamente! Controlla bene avrai modificato qualcosa.
  • Re: Conversione da binario a decimale

    barba59 ha scritto:


    ciao ixamit,
    è sempre un piacere vedere delle chicche del genere!

    Giusto per diverimento posto una variante:
    
       for (decimale=0,e=1; binario; binario/=10,e*=2)
          decimale += e*(binario%2);
    
    Abbrevio la mia precedente:
    
       ...
       for (decimale=0,e=1;binario;decimale|=e*(binario%2),binario/=10,e<<=1);
       ...
    
  • Re: Conversione da binario a decimale

    ixamit ha scritto:


    Abbrevio la mia precedente:
    
       for (decimale=0,e=1;binario;decimale|=e*(binario%2),binario/=10,e<<=1);
    
    Giusto! e scriviamola pure in forma compatta per aumentarne la bellezza!
    
    for(d=0,e=1; b; d|=e*(b%2),b/=10,e<<=1);
    
    e poi diamo ancora una limatina:
    
    for(d=0,e=1; b; d+=b%2*e,b/=10,e*=2);
    
  • Re: Conversione da binario a decimale

    A me continuava a dare quei valori sballati.
    Comunque credo di aver capito dov'era il problema:
    static_cast< int >( pow( 10, i ) )
    Infatti ho provato ad assegnare prima "pow( 10, i )" ad una variabile di tipo double e poi l'ho convertita in intero, in questo modo non mi crea alcun problema.
    Ma è normale che lo "static_cast" crei problemi con la funzione "pow"???
Devi accedere o registrarti per scrivere nel forum
9 risposte