Ich möchte Bits einer Dezimalzahl extrahieren.
Zum Beispiel ist 7 binär 0111, und ich möchte 0 1 1 1 alle in bool gespeicherten Bits erhalten. Wie kann ich das machen?
OK, eine Schleife ist keine gute Option. Kann ich etwas anderes dafür tun?
c
bit-manipulation
Badr
quelle
quelle
(n >> k) & 1
ist gleichermaßen gültig und erfordert keine Berechnung der Maske, da die Maske aufgrund von Verschiebungen vor dem Maskieren konstant ist und nicht umgekehrt.struct
kann es auch nützlich sein, die Daten auf a zu übertragen, da Sie alle erforderlichen Daten mit einer einzigen Operation erhalten.Wie gewünscht, habe ich beschlossen, meinen Kommentar zur Antwort des Zeigefingers auf eine vollständige Antwort auszudehnen. Obwohl seine Antwort richtig ist, ist sie unnötig komplex. Darüber hinaus verwenden alle aktuellen Antworten vorzeichenbehaftete
int
s, um die Werte darzustellen. Dies ist gefährlich, da die Rechtsverschiebung negativer Werte implementierungsdefiniert ist (dh nicht portierbar ist) und die Linksverschiebung zu undefiniertem Verhalten führen kann (siehe diese Frage ).Durch Verschieben des gewünschten Bits nach rechts in die niedrigstwertige Bitposition kann eine Maskierung durchgeführt werden
1
. Es ist nicht erforderlich, für jedes Bit einen neuen Maskenwert zu berechnen.Berechnen (und anschließend drucken) eines Arrays von Einzelbitwerten als vollständiges Programm:
Angenommen, Sie möchten alle Bits wie in diesem Fall berechnen und nicht ein bestimmtes, kann die Schleife weiter in geändert werden
Dies ändert sich
input
an Ort und Stelle und ermöglicht dadurch die Verwendung einer Einzelbitverschiebung mit konstanter Breite, die bei einigen Architekturen effizienter sein kann.quelle
Hier ist eine Möglichkeit, dies zu tun: Es gibt viele andere:
Es ist schwer zu verstehen, warum die Verwendung einer Schleife nicht erwünscht ist, aber es ist einfach genug, die Schleife abzuwickeln:
Oder konstante Ausdrücke in den letzten vier Anweisungen auswerten:
quelle
Hier ist eine sehr einfache Möglichkeit, dies zu tun.
quelle
@prateek danke für deine Hilfe. Ich habe die Funktion mit Kommentaren zur Verwendung in einem Programm umgeschrieben. Erhöhen Sie 8 für weitere Bits (bis zu 32 für eine Ganzzahl).
quelle
Wenn Sie keine Schleifen möchten, müssen Sie diese ausschreiben:
Wie hier gezeigt, funktioniert dies auch in einem Initialisierer.
quelle
quelle
Verwenden von
std::bitset
quelle