Wie bekomme ich das "verlorene" Bit von einer Bitverschiebung?

7

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?

    
Svad Histhana 27.02.2012, 08:24
quelle

5 Antworten

11

Sie müssen das Bit vor der Verschiebung erfassen:

%Vor%     
NPE 27.02.2012, 08:26
quelle
5

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.)

    
James Kanze 27.02.2012 08:29
quelle
3

Um dies für jede Schicht und jeden Typ zu tun, kehren Sie die Operation um (um zu überprüfen, ob Sie etwas verloren haben).

%Vor%     
bitmask 27.02.2012 08:38
quelle
1

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):

%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%     
Sebastian Mach 27.02.2012 15:13
quelle
0

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.

    
jogojapan 27.02.2012 08:41
quelle