Как напечатать один бит?

Подскажите, пожалуйста, как мне напечатать бит, например printf("%d",bit);.


person Community    schedule 08.12.2008    source источник
comment
Это хороший вопрос, который нужно перефразировать, но у меня пока нет прав на редактирование....   -  person Jarred McCaffrey    schedule 18.12.2008


Ответы (6)


Если бит - это просто целое число, содержащее требуемое значение в младшем значащем бите, то:

printf("%d", bit & 0x1);

должен сделать это. & выполняет двоичное И с числом, в котором установлен только первый значащий бит, поэтому вы удаляете все остальные биты в целом числе.

person Herms    schedule 08.12.2008
comment
Имейте в виду, что извлечение одного бита из многобайтового числа приводит к проблемам с порядком байтов. - person gnud; 08.12.2008
comment
@gnud: это применимо только тогда, когда это делается против памяти с использованием указателей. bit & 0x1 будет работать всегда, независимо от того, как значение хранится в памяти. - person unwind; 08.12.2008

Если вам нужно обобщить больше, чем Herms, вы можете сделать это:

#define IsBitSet(val, bit) ((val) & (1 << (bit)))

/* ... your code ... */

printf ("%c", IsBitSet(bit, 0) ? '1' : '0');

printf эквивалентен ответу Herms как есть.

Если вы говорите о битовом поле в C, вы можете сделать это:

struct foo { int b:1; } myFoo;

printf("%c", myFoo.b ? '1' : '0');
person plinth    schedule 08.12.2008
comment
В конце определения макроса отсутствует закрывающая скобка, не так ли? - person bortzmeyer; 18.12.2008
comment
Это кажется немного окольным путем — почему бы не ((val) >> (bit)) & 0x1, чтобы вы могли напечатать его как целое число вместо троичного? - person Aaron Dufour; 06.10.2012

Связанный вопрос: Как установить, очистить и переключить один бит? — это расширенное обсуждение однобитового доступа в C и C++.

person dmckee --- ex-moderator kitten    schedule 08.12.2008

Чтобы напечатать m-й бит (m от 1..16 или 32) числа n:

void print_bit(n, m)
{
    printf("%d", n & (1 << (m - 1)));
}

Удалите бит - 1, если ваш счетчик битов начинается с 0.

person Keltia    schedule 08.12.2008
comment
Это не совсем сработает. Вы маскируете нужный бит, но оставляете этот бит на месте, поэтому вы не получите 1 или 0. Чтобы всегда получать 1 или 0 для этого бита, вам нужно сдвинуть переменную вправо, а не сдвиг маска осталась. - person Herms; 08.12.2008
comment
Что такое бит в вашей функции? И n не используется. Вы имели в виду printf(%d, n & (1 ‹‹ (m - 1)) ? - person Koshmaar; 07.05.2016

Ответ C++ проще, чем ответ C89, с собственным типом bool:

bool b = true;
std::cout << b;

C99 очень похож:

_Bool b = 1;
printf("%d", b);
person MSalters    schedule 09.12.2008
comment
Логические значения обычно не имеют размера в один бит. - person Jasper Bekkers; 18.12.2008

Вы можете использовать «союз»:

union bitshow {
    unsigned bit1:1;
    int i;
};

int main() {
    union bitshow bit;
    cin >> bit.i;
    cout << bit.bit1;
    return 0;
}
person Sajjad Mohammadadeh    schedule 11.07.2011
comment
Будет ли это печатать старший бит, младший бит или что-то еще? Вы не можете знать, потому что это не портативно. - person interjay; 11.07.2011