Bits de impresión C

Estoy tratando de escribir un progtwig en C que imprima bits de int. Por alguna razón me sale valores equivocados,

void printBits(unsigned int num){ unsigned int size = sizeof(unsigned int); unsigned int maxPow = 1<<(size*8-1); printf("MAX POW : %u\n",maxPow); int i=0,j; for(;i<size;++i){ for(j=0;j<8;++j){ // print last bit and shift left. printf("%u ",num&maxPow); num = num<<1; } } } 

Mi pregunta, primero , ¿por qué obtengo este resultado (para printBits (3)).

POW MAX: 2147483648 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 2147483648 214748364 8

Segundo, ¿hay una mejor manera de hacer esto?

Está calculando el resultado correctamente, pero no lo está imprimiendo correctamente. Además no necesitas un segundo bucle:

 for(;i 

Si desea presumir, puede reemplazar el condicional con dos signos de exclamación:

 printf("%u ", !!(num&maxPow)); 

El resultado que obtienes es porque num&maxPow es 0 o maxPow . Para imprimir 1 en lugar de maxPow , puede usar printf("%u ", num&maxPow ? 1 : 0); . Una forma alternativa de imprimir los bits es

 while(maxPow){ printf("%u ", num&maxPow ? 1 : 0); maxPow >>= 1; } 

es decir, desplazando la máscara de bits a la derecha en lugar de num izquierda. El bucle finaliza cuando el bit de conjunto de la máscara se desplaza.

Para abordar el punto dos, consideraría lo siguiente, que se simplifica un poco para facilitar la comprensión.

 void printBits(unsigned int num) { for(int bit=0;bit<(sizeof(unsigned int) * 8); bit++) { printf("%i ", num & 0x01); num = num >> 1; } } 
 void print_bits(unsigned int x) { int i; for(i=8*sizeof(x)-1; i>=0; i--) { (x & (1 << i)) ? putchar('1') : putchar('0'); } printf("\n"); }