Ich möchte eine Variable bit verschieben und das Bit speichern, das in einem booleschen Wert ausgegeben wird.
Etwas wie:
%Vor%Wie kann dies erreicht werden?
Sie nicht. Sie müssen es vor der Schicht testen:
%Vor%(Dies ist einfach für eine Rechtsverschiebung. Für eine Linksverschiebung müssen Sie wissen die Anzahl der Bits im Wort.)
Wenn Sie nach einer Rotationsfunktion suchen, können Sie Folgendes versuchen:
Zuerst eine Meta-Funktion, um die Anzahl der Bits des zu drehenden Wertes zu erhalten (Hinweis: 8*sizeof(T)
wäre nicht portabel; der Standard schreibt nur mindestens 8 Bits vor):
Als nächstes definieren Sie eine Funktion für die Rechtsdrehung. Dies geschieht, indem eine Rechtsverschiebung wie erwartet angewendet wird, und eine Verschiebung nach links, um das zu verschieben, was sonst aufgehoben würde:
%Vor%Habe eine Diagnosefunktion zum Testen und Testen:
%Vor%Ausgabe:
%Vor%Eine Linksrotation kann ähnlich oder in Bezug auf die Rechtsrotation implementiert werden.
Wie bei der Leistung erkennt g ++ das Idiom und verwendet einen Rotationsbefehl auf x86 und amd64.
%Vor%Hier ist eine Alternative zu den bisherigen Vorschlägen:
%Vor% Dies setzt voraus, dass int
ist, was int
normalerweise für diese Tage bedeutet, d.h. int32_t
. Er kopiert es in ein int64_t
, führt dann die Verschiebung durch, kopiert die höheren 32 Bits in i
und gibt dann die unteren 32 Bits (die das verschobene 1
enthalten) als Bool zurück.
Ich weiß nicht, ob das schneller ist als die anderen Ansätze. Der zusätzliche Vorteil dieses allgemeinen Ansatzes besteht darin, dass er verwendet werden kann, um mehr als ein einzelnes Bit, z. wenn Sie um 2 oder mehr Bits verschieben.
Tags und Links c++ visual-c++ bit-manipulation