Почему printf () печатает 21 вместо 11, когда получает битовую маску для 3? - PullRequest
0 голосов
/ 22 апреля 2019

Цель этого упражнения - напечатать двоичное представление числа.

Учитывая следующий код, я получаю 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 & 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");
}

Ответы [ 2 ]

3 голосов
/ 22 апреля 2019

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

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

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

2 голосов
/ 22 апреля 2019

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

n >> bit & 1

Например,

unsigned int check_bit(unsigned int bit, unsigned int n) {
    return n >> bit & 1;                                  
}                                                         
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...