#include int *decToBin(int decimal, int nBits, int binary[]); void WriteBin(int binary[], int nBits); int main(int argc, char *argv[]) { int binary[10]; int i; for (i=-20; i<20; i++) { printf("%d\t-->\t", i); WriteBin(decToBin(i, 10, binary), 10); printf("\n"); } return 0; } void WriteBin(int binary[], int nBits) { int i; for (i=0; i0, 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; }