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