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)

  1. 11 junio, 2009 19:17 | #1
    Usando Internet Explorer Internet Explorer 7.0 en Windows Windows XP

    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. admin
    11 junio, 2009 19:35 | #2
    Usando Mozilla Firefox Mozilla Firefox 3.0.6 en Gentoo Linux Gentoo Linux

    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
    31 enero, 2010 5:27 | #3
    Usando Internet Explorer Internet Explorer 7.0 en Windows Windows XP

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

  4. admin
    31 enero, 2010 15:43 | #4
    Usando Mozilla Firefox Mozilla Firefox 3.6 en Linux Linux

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

  1. junio 2nd, 2009 at 23:03 | #1
  2. enero 15th, 2010 at 20:19 | #2

Top