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)