C биты печати

Я пытаюсь написать программу на C, которая печатает биты int. по какой-то причине я получаю неправильные значения,

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

Мой вопрос, first, почему я получаю этот результат (для 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 2147483648 214748364 8

второй есть ли лучший способ сделать это?

Ответ 1

Вы правильно вычисляете результат, но вы не печатаете его правильно. Также вам не нужен второй цикл:

for(;i<size*8;++i){
    // print last bit and shift left.
    printf("%u ",num&maxPow ? 1 : 0);
    num = num<<1;
}

Если вы хотите показать, вы можете заменить условное обозначение двумя восклицательными знаками:

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

Ответ 2

Результат получается потому, что num&maxPow равен 0 или maxPow. Чтобы напечатать 1 вместо maxPow, вы можете использовать printf("%u ", num&maxPow ? 1 : 0);. Альтернативный способ печати битов -

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

то есть. смещение битовой маски справа вместо num влево. Цикл заканчивается, когда установленный бит маски сбрасывается.

Ответ 3

Чтобы обратиться к второй точке, я бы рассмотрел следующее, что упрощено для упрощения понимания.

void printBits(unsigned int num)
{
   for(int bit=0;bit<(sizeof(unsigned int) * 8); bit++)
   {
      printf("%i ", num & 0x01);
      num = num >> 1;
   }
}

Ответ 4

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