Conversione da binario a decimale

di Anonimizzato10532 il
9 risposte
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

  • 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).
  • 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.
  • 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;
  • 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;
       ...
    
  • 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.
  • 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.
  • 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);
       ...
    
  • 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);
    
  • 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