2008-12-08 6 views
6

Bitte sagen Sie mir, wie ich ein bisschen, wie printf("%d",bit); drucken.Wie drucke ich ein Bit?

+0

Dies ist eine gute Frage, die neu formuliert werden muss, aber ich habe noch keine Bearbeitungsrechte .... –

Antwort

19

Wenn Bit ist nur ein int, das den Wert, den Sie in dem niedrigstwertigen Bit wollen enthält, dann:

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

sollte es tun. Die & macht eine binäre AND mit einer Zahl, bei der nur das erste signifikante Bit gesetzt ist, also entfernen Sie alle übrigen Bits in der ganzen Zahl.

+0

Denken Sie daran, dass ein Bit extrahiert Aus einer Multi-Byte-Nummer können Sie auf Endianess-Probleme stoßen. – gnud

+4

@gnud: Das gilt nur, wenn es gegen Speicher gemacht wird, mit Zeigern. Bit & 0x1 wird immer funktionieren, unabhängig davon, wie der Wert im Speicher gespeichert wird. – unwind

3

Um die m-te Bit (m von 1..16 oder 32) von n zu drucken:

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

die - 1 Bit entfernen, wenn Ihr Bit-Zähler beginnt bei 0.

+0

Das wird nicht ganz funktionieren. Sie maskieren das Bit, das Sie wollen, aber Sie lassen dieses Bit an Ort und Stelle, so dass Sie nicht 1 oder 0 erhalten. Um immer 1 oder 0 für dieses Bit zu bekommen, müssten Sie die Variable nach rechts verschieben, nicht verschieben die Maske übrig. – Herms

+0

Richtig, verpasst, danke. – Keltia

+1

Was ist ein bisschen in Ihrer Funktion? Und "n" wird nicht verwendet. Meinten Sie printf ("% d", n & (1 << (m - 1))? – Koshmaar

9

Wenn Sie brauchen mehr als Herms zu verallgemeinern, können Sie dies tun:

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

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

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

Die printf Herms Antwort entspricht, wie ist.

Wenn Sie sich über bitfield in C sprechen, können Sie dies tun:

struct foo { int b:1; } myFoo; 

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

Am Ende der Makrodefinition fehlt eine schließende Klammer, nein? – bortzmeyer

+0

good catch - fixed it. – plinth

+1

Dies scheint ein bisschen Kreisverkehr - warum nicht '((val) >> (bit)) & 0x1' so können Sie es als eine ganze Zahl anstelle der ternären drucken? –

1

Die C++ Antwort ist einfacher als die C89 ein, mit dem nativen Bool Typ:

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

C99 ist ganz ähnlich:

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

Bools sind in der Regel nicht ein Bit in der Größe. –

1

Sie verwenden können "union":

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

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

Wäre das Drucken der wichtigsten Bit, Least Significant Bit oder etwas anderes? Sie können es nicht wissen, weil es nicht tragbar ist. – interjay