Inicio > C/C++ > Decimal a Binario (y negativos en Complemento a 2)

Decimal a Binario (y negativos en Complemento a 2)

Aquí traigo un fragmento de código que nos puede ayudar bastante a la hora de hacer cambios de base de decimal a binario, sobre todo porque para manejarnos con los números negativos utilizamos el Complemento a dos.

En principio, antes de hacer esta función miré un poco el blog Static Zero, y luego me decidí simplificar un poco el código. Así ha quedado:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
int *decToBin(int decimal, int nBits, int binary[]) {
    int i;

    int flag = 0;
    /* Si es un número negativo, lo hacemos positivo y le restamos 1(*), */
    /* además activamos el flag para saber que es negativo */

    /* (*) El complemento a 2 es igual que el complemento a 1, que es cambiar */
    /* 1->0, 0->1, y luego sumando 1 en binario. Aquí restamos 1 en decimal y */
    /* luego pasamos a binario. */
    if (decimal < 0)
        {
            flag = 1;
            decimal = -decimal-1;
        }

    /* Pasamos a binario, atendiendo a lo que vale flag, en lugar de añadir (decimal%2) */
    /* como es normal, le hacemos un XOR con flag, vemos la tabla de verdad de XOR */
    /* |    A    (xor)   B       =   X   |  */
    /* |     0      |        0       |   0   |  */
    /* |     0      |        1       |   1   |  */
    /* |     1      |        0       |   1   |  */
    /* |     1      |        1       |   0   |  */
    /* ------------------------------   */
    /* Por tanto, cuando flag vale 0, al encontrar un 0, pondremos un 0, y al encontrar un 1, ponemos un 1 */
    /*           Pero cuando flag vale 1, al encontrar un 0, pondremos un 1, y al encontrar un 1, ponemos un 0 */
    while (decimal > 0)
        {
            binary[--nBits] = flag^(decimal%2);
            decimal/=2;
        }

    /* Con esto terminamos de llenar el array, con 0 a la izquierda si es un número positivo */
    /* y con 1s si es un número negativo */
    while (nBits>0)
        binary[--nBits] = flag;
   
    /* Devolvemos el array */
    return binary;
}

Para descargar este código y un pequeño programa de prueba:
Pasar de decimal a binario (Negativos en complemento a 2)

votar
  1. Jueves, 11 de Junio de 2009 a las 19:17 | #1

    necesito un programa que pueda convertir de decimal a binario, tiene que llevar un numero negativo, otro positivo, otro entero y otro en fraccion y hay q almacenarlo

  2. Jueves, 11 de Junio de 2009 a las 19:35 | #2

    Para enteros positivos y negativos tienes este, para reales, es parecido, te recomiendo que leas:
    http://es.wikipedia.org/wiki/Coma_flotante
    http://es.wikipedia.org/wiki/IEEE_punto_flotante
    Para ver cómo hay que almacenarlo. Con el ejemplo, tendrías la representación del número, luego tienes que añadir la posición de la coma, depende de los decimales que tenga el número

  3. r.doradus
    Domingo, 31 de Enero de 2010 a las 05:27 | #3

    Orale que buen programa, eres bueno, lo probé y modifique en visual c++ y funcionó bien, loprobare para __int64 a ver que tal!

  4. Domingo, 31 de Enero de 2010 a las 15:43 | #4

    @r.doradus
    Gracias !! Si lo posteas en algún sitio cuando lo adaptes, agradecería que me pasaras el link :)

  1. Martes, 2 de Junio de 2009 a las 23:03 | #1
  2. Viernes, 15 de Enero de 2010 a las 20:19 | #2

Visita otras webs de la red