Bitte sagen Sie mir, wie ich ein bisschen, wie printf("%d",bit);
drucken.Wie drucke ich ein Bit?
Antwort
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.
Denken Sie daran, dass ein Bit extrahiert Aus einer Multi-Byte-Nummer können Sie auf Endianess-Probleme stoßen. – gnud
@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
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.
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
Richtig, verpasst, danke. – Keltia
Was ist ein bisschen in Ihrer Funktion? Und "n" wird nicht verwendet. Meinten Sie printf ("% d", n & (1 << (m - 1))? – Koshmaar
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');
Am Ende der Makrodefinition fehlt eine schließende Klammer, nein? – bortzmeyer
good catch - fixed it. – plinth
Dies scheint ein bisschen Kreisverkehr - warum nicht '((val) >> (bit)) & 0x1' so können Sie es als eine ganze Zahl anstelle der ternären drucken? –
Verwandte Frage: How do you set, clear, and toggle a single bit? ist eine erweiterte Diskussion von Single-Bit-Zugriff in C und C++.
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);
Bools sind in der Regel nicht ein Bit in der Größe. –
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;
}
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
Dies ist eine gute Frage, die neu formuliert werden muss, aber ich habe noch keine Bearbeitungsrechte .... –