Почему printf() выводит 21 вместо 11 при задании битовой маски для 3?

#c

#c

Вопрос:

Смысл этого упражнения в том, чтобы напечатать двоичное представление числа.

Учитывая следующий код, я получаю 00000000000000000000000000000021, напечатанный вместо ожидаемого 00000000000000000000000000000011, когда я запускаю print_binary(3).

Я думаю, что я здесь чего-то не хватает. Может кто-нибудь, пожалуйста, объяснить, почему я получаю такой неожиданный результат?

Я использую gcc версии 6.3.0 20170516 (Debian 6.3.0-18 deb9u1). Чтобы протестировать эту программу.

 #include <stdio.h>
#include <stdbool.h>
#include <limits.h>

#define INT_BITS sizeof(int) * 8

unsigned int check_bit(unsigned int bit, unsigned int n) {
    unsigned int mask = (1 << bit);
    return n amp; mask;
}

void print_binary(unsigned int num) {
    int bits[INT_BITS];
    for (int i = INT_BITS - 1; i >= 0; i--) {
        printf("%u", check_bit(i, num));
    }
    printf("n");
}
  

Комментарии:

1. возврат (n amp; mask) > 0;

2. Приобретите привычку заключать в круглые скобки замены макросов, вы будете благодарны себе позже … #define INT_BITS (sizeof(int) * 8)

Ответ №1:

Потому что при check_bit() работе с битом 1 вы получаете:

 unsigned int mask = (1 << 1);
return 3 amp; 2;    /* n amp; mask => result is b11 amp; b10 which is b10 which is decimal 2 */
  

Таким образом, 2 выполняется печать с использованием unsigned спецификатора, следовательно, вы получаете ..021 , а не ..011

Ответ №2:

Попробуйте это

 n >> bit amp; 1
  

Например

 unsigned int check_bit(unsigned int bit, unsigned int n) {
    return n >> bit amp; 1;                                  
}