convertir un número entero positivo en C++ (0 a 2.147.483.647) de 32 bits binarios y la pantalla.

Quiero hacerlo en la tradicional «matemática» (en lugar de utilizar bitset o uso vector *.el retroceso de* o función recursiva o alguna cosa especial en C++…), (una de las razones es por lo que se puede implementar en diferentes idiomas, bueno, tal vez)

Así que vaya por delante e implementar un programa simple como esto:

#include <iostream>
using namespace std;
int main()
{
    int dec,rem,i=1,sum=0;
    cout << "Enter the decimal to be converted: ";
    cin>>dec;
    do
    {
        rem=dec%2;
        sum=sum + (i*rem);
        dec=dec/2;
        i=i*10;
    } while(dec>0);

    cout <<"The binary of the given number is: " << sum << endl;

    system("pause");
    return 0;
}

Problema es cuando la entrada de un gran número 9999, el resultado será negativo o alguna extraña número, porque la suma es un número entero y no puede manejar más de su rango máximo, así que usted sabe que una de 32 bits binarios tendrá 32 dígitos por lo que es demasiado grande para cualquier tipo de número en C++?. Cualquier sugerencia aquí y acerca de la pantalla de 32 bits número de preguntas de la entrevista?

trate de usar un long int para la variable sum.
Leer un poco de C++ introducción acerca de +=, /= y *=.
Dado el hecho de que usted ha marcado una respuesta, supongo que no hay más necesidad de un matemático de la respuesta.

OriginalEl autor Ronaldinho Learn Coding | 2012-05-21

7 Comentarios

  1. 3

    Utilizar un for-loop, y un predefinidos matriz de cero caracteres:

    #include <iostream>
    using namespace std;
    int main()
    {
        int dec;
        cout << "Enter the decimal to be converted: ";
        cin >> dec;
    
        char bin32[]  = "00000000000000000000000000000000";
        for (int pos = 31; pos >= 0; --pos)
        {
            if (dec % 2) 
                bin32[pos] = '1';
            dec /= 2;
        }
    
        cout << "The binary of the given number is: " << bin32 << endl;
    }

    Por motivos de rendimiento, prematuramente puede suspender el bucle for:

        for (int pos = 31; pos >= 0 && dec; --pos)

    Nota, que en C++, se puede tratar a un número entero como un valor booleano – ¡todo != 0 es cierto.

    OriginalEl autor user unknown

  2. 7

    Lo que usted consigue en sum como resultado es difícilmente utilizable para cualquier cosa, pero la impresión. Es un número decimal que sólo se ve como un binario.

    Si el decimal-binario conversión no es un fin en sí mismo, tenga en cuenta que los números en la memoria de la computadora son ya representados en binario (y no es la propiedad de C++), y la única cosa que usted necesita es una manera de imprimir. Una de las formas posibles es la siguiente:

    int size = 0;
    for (int tmp = dec; tmp; tmp >>= 1)
        size++;
    for (int i = size - 1; i >= 0; --i)
        cout << ((dec >> i) & 1);

    Otra variante utilizando una matriz de caracteres:

    char repr[33] = { 0 };
    int size = 0;
    for (int tmp = dec; tmp; tmp >>= 1)
        size++;
    for (int i = 0; i < size; ++i)
        repr[i] = ((dec >> (size - i - 1)) & 1) ? '1' : '0';
    cout << repr << endl;

    Nota que ambas variantes no funcionan si dec es negativo.

    El hecho de que el valor es la representación física como binario en la memoria no es particularmente relevante para la impresión de la representación binaria de esta manera, así como la impresión de que en decimal no requiere que el valor para ser representada físicamente en decimal. Por ejemplo, el >> operador en C++ se define en potencias de dos, por lo que incluso en un sistema ternario se obtienen los mismos valores (aunque sería más caro).
    Si el número está representado, por ejemplo, en ternario, a continuación, en orden de imprimir en ternario que no convertir como operador >>. Sería suficiente con solo leer e imprimir el almacenado dígitos.
    «Sería suficiente leer e imprimir el almacenado dígitos.» Mi punto puede ser reformulada de la siguiente manera; que el acceso ternario dígitos en un ternario de la máquina se ve igual que la aritmética que usted haría en cualquier otra máquina para producir el ternario de la representación. I. e. un montón de divide y mods por 3. En ese sentido, la representación física es irrelevante. Del mismo modo, la producción de una representación binaria tiene el mismo aspecto que si estás en un decimal, binario o ternario de la máquina.
    Ahora entiendo tu punto de vista. Estás en lo correcto. Mi error fue pensar que en ternario operador de la máquina >> habría «shift uno ternario dígitos a la derecha» la semántica.

    OriginalEl autor Alex Bakulin

  3. 4

    Tiene un número y desea que su representación binaria, yo.e, un cadena. Así, el uso de una cadena, no un tipo numérico, para almacenar su resultado.

    OriginalEl autor R. Martinho Fernandes

  4. 2

    Se podría utilizar un tipo de entero sin signo. Sin embargo, incluso con un tipo mayor que se le agote el espacio para almacenar representaciones binarias. Usted probablemente estaría mejor guardarlos en un string.

    aceptar cualquier sugerencia si el uso de cadenas para representar 32 bits del número binario? si introduce 5, binario 101 pero tiene que ser 29 ‘0’ dígitos antes de 101?
    pregunta requiere de la pantalla de 32 bits del número binario, es por eso?
    Entonces sí, usted necesitará cero de la almohadilla de la cadena.

    OriginalEl autor dirkgently

  5. 1

    Como otros han señalado, es necesario generar los resultados en un
    de la cadena. La manera clásica de hacer esto (que funciona para cualquier base entre 2 y 36) es:

    std::string
    toString( unsigned n, int precision, unsigned base )
    {
        assert( base >= 2 && base <= 36 );
        static char const digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        std::string retval;
        while ( n != 0 ) {
            retval += digits[ n % base ];
            n /= base;
        }
        while ( retval.size() < precision ) {
            retval += ' ';
        }
        std::reverse( retval.begin(), retval.end() );
        return retval;
    }

    A continuación, puede mostrar.

    OriginalEl autor James Kanze

  6. 0

    La recursividad. En pseudocódigo:

    function toBinary(integer num)
      if (num < 2) 
      then
        print(num)
      else
        toBinary(num DIV 2)
        print(num MOD 2)
      endif
    endfunction

    Esto no manejar los ceros a la izquierda o números negativos. La recursividad de la pila se utiliza para invertir el binario de bits en el orden estándar.

    OriginalEl autor rossum

  7. 0

    Acaba de escribir:

    long int dec,rem,i=1,sum=0  

    Lugar de:

    int dec,rem,i=1,sum=0;

    Que debe resolver el problema.

    hmm … long int – ¿estás seguro? De todos modos, por favor, edita tu respuesta y el formato del código (de 4 espacios en la línea de inicio, ctrl-k es tu amigo 🙂

    OriginalEl autor Milind

Dejar respuesta

Please enter your comment!
Please enter your name here