C bits d’impression

J’essaie d’écrire un programme en C qui affiche des bits d’int. pour une raison quelconque, je me trompe de valeurs,

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; } } } 

Ma question, premièrement, pourquoi ai-je ce résultat (pour printBits (3)).

MAX POW: 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 0 2147483648 214748364 8

Deuxièmement, existe-t-il une meilleure façon de procéder?

Vous calculez correctement le résultat, mais vous ne l’ imprimez pas correctement. De plus, vous n’avez pas besoin d’une deuxième boucle:

 for(;i 

Si vous souhaitez montrer, vous pouvez remplacer le conditionnel par deux points d'exclamation:

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

Le résultat obtenu est que num&maxPow pour valeur 0 ou maxPow . Pour imprimer 1 au lieu de maxPow , vous pouvez utiliser printf("%u ", num&maxPow ? 1 : 0); . Une autre façon d’imprimer les bits est de

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

c’est-à-dire décaler le masque de bits à droite au lieu de num gauche. La boucle se termine lorsque le bit défini du masque est décalé.

Pour aborder le deuxième point, je considérerais ce qui suit, qui est un peu simplifié pour faciliter la compréhension.

 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"); }