2008-12-08 12 views
6

Poinformuj mnie, jak mogę wydrukować trochę, jak printf("%d",bit);.Jak wydrukować jeden bit?

+0

To jest dobre pytanie, które wymaga przeprogramowania, ale nie mam jeszcze uprawnień do edycji ... –

Odpowiedz

19

Jeśli bit jest tylko int, który zawiera żądaną wartość w najmniej znaczącego bitu, a następnie:

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

powinno wystarczyć. & wykonuje binarne-ORAZ o numerze tylko z pierwszym znaczącym bitem, więc usuwasz wszystkie pozostałe bity w liczbie całkowitej.

+0

Należy pamiętać, że wydobycie jednego bitu od liczby wielobajtowej sprawia, że ​​napotkasz problemy z endiansem. – gnud

+4

@gnud: To ma zastosowanie tylko wtedy, gdy zostanie zrobione przeciwko pamięci, za pomocą wskaźników. bit i 0x1 zawsze będą działały, niezależnie od sposobu zapisania wartości w pamięci. – unwind

3

Aby wydrukować trochę m-ty (m od 1..16 lub 32) N:

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

Zdjąć - 1 trochę jeśli bitowy licznik zaczyna się od 0.

+0

To się nie uda. Ukrywasz bit, który chcesz, ale pozostawiasz ten fragment na miejscu, więc nie otrzymasz 1 ani 0. Aby zawsze uzyskać 1 lub 0 dla tego bitu, musisz przesunąć zmienną w prawo, a nie przesunąć maska ​​została. – Herms

+0

Dobrze, nieodebrane, dzięki. – Keltia

+1

Co jest nieco w twojej funkcji? "N" nie jest używane. Czy chodziło Ci o printf ("% d", n & (1 << (m - 1))? – Koshmaar

9

Jeśli potrzebujesz aby uogólnić więcej niż Herms, możesz to zrobić:

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

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

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

Plik printf jest odpowiednikiem odpowiedzi Herms, jak jest.

Jeśli mówisz bitfield w C, można to zrobić:

struct foo { int b:1; } myFoo; 

printf("%c", myFoo.b ? '1' : '0'); 
+0

Brakuje nawiasu zamykającego na końcu definicji makra, nie? – bortzmeyer

+0

dobre złapanie - naprawiono to. – plinth

+1

trochę ronda - dlaczego nie "((val) >> (bit)) i 0x1', więc możesz wydrukować go jako liczbę całkowitą zamiast potrójnego? –

1

C++ odpowiedź jest łatwiejsza niż C89 jednego z natywnego typu bool:

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

C99 jest dość podobny:

_Bool b = 1; 
printf("%d", b); 
+0

Boole są generalnie niejedno bitowe. –

1

Można użyć "unii":

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

int main() { 
    union bitshow bit; 
    cin >> bit.i; 
    cout << bit.bit1; 
    return 0; 
} 
+3

Czy to wydrukować najbardziej znaczące bit, najmniej znaczący bit lub coś innego? Nie możesz tego wiedzieć, ponieważ nie jest przenośny. – interjay