2010-03-25 10 views
5

Ich versuche, Bit-Umkehrung in einem Byte zu tun. Ich verwende den Code untenBit Umkehrung mit bitweisen

static int BitReversal(int n) 
{ 
    int u0 = 0x55555555; // 01010101010101010101010101010101 
    int u1 = 0x33333333; // 00110011001100110011001100110011 
    int u2 = 0x0F0F0F0F; // 00001111000011110000111100001111 
    int u3 = 0x00FF00FF; // 00000000111111110000000011111111 
    int u4 = 0x0000FFFF; 
    int x, y, z; 
    x = n; 
    y = (x >> 1) & u0; 
    z = (x & u0) << 1; 
    x = y | z; 

    y = (x >> 2) & u1; 
    z = (x & u1) << 2; 
    x = y | z; 

    y = (x >> 4) & u2; 
    z = (x & u2) << 4; 
    x = y | z; 

    y = (x >> 8) & u3; 
    z = (x & u3) << 8; 
    x = y | z; 

    y = (x >> 16) & u4; 
    z = (x & u4) << 16; 
    x = y | z; 

    return x; 
} 

Es kann das Bit-Umkehrer (auf einer 32-Bit-Maschine), aber es ist ein Problem, Zum Beispiel der Eingabe 10001111101, ich will 10111110001 erhalten, aber diese Methode würde das ganze Byte einschließlich der Überschrift 0s umkehren. Die Ausgabe ist 1011111000100000000000000000000000. Gibt es irgendeine Methode, nur die tatsächliche Zahl umzukehren? Ich möchte es nicht in String und Reverser konvertieren und dann erneut konvertieren. Gibt es eine reine mathematische Methode oder Bit-Operation?

Mit besten Grüßen,

+0

Obwohl ich Ihre Methode verstehe: Es kann nicht kompilieren, da Sie u4 verwenden und in Ihrem Beispiel nicht definiert haben. –

+0

Hinzufügen int u4 = 0x0000FFFF; – user287792

+0

Das ist nicht der Grund, ich vermisse das nur. –

Antwort

1

Cheesy Weg zu verschieben, bis Sie eine 1 auf der rechten Seite erhalten:

if (x != 0) { 
    while ((x & 1) == 0) { 
     x >>= 1; 
    } 
} 

Hinweis: Sie sollten alle Variablen zu unsigned int wechseln. Wie Sie geschrieben haben, können Sie jederzeit unerwünschte Zeichenerweiterungen haben, wenn Sie rechts verschieben.

+0

Du solltest prüfen, ob der eingegebene Wert Null ist, weil du vielleicht eine Endlosschleife hast. –

+0

Und achten Sie darauf, was das Zeichen-Bit auf einer signierten Rechtsverschiebung tut, es ist implementation-defined. Wahrscheinlich ist es richtig, dass der Code des Fragestellers auf unsigned int umschaltet: Es gibt keinen Grund dafür, dass er unterschrieben wird und es lohnt sich nicht. –

4

die höchste Bit-Zahl mit einem ähnlichen Ansatz bekommen und die resultierenden Bits nach rechts 33 verschieben - #bits und voila!

0

Eine Methode könnte sein, die führende Anzahl von Vorzeichenbits in der Zahl n zu finden, links schiebe n um diese Zahl und führe sie dann durch den obigen Algorithmus.

+0

Das ist falsch: 1000 (High Bit 3) wird zu << 3 und damit 10000000 und umgekehrt ist das 0x02000000, und nicht 1! –

+0

@Ritsaert: 1000 hat 24 führende Zeichenbits, also verschiebst du 24, nicht 3 –

0

Es wird angenommen, dass alle 32 Bits signifikant sind und die ganze Sache umkehren. Sie könnten versuchen, die Anzahl der signifikanten Bits zu erraten, indem Sie die höchste 1 finden, aber das ist nicht unbedingt genau, also würde ich vorschlagen, dass Sie die Funktion so ändern, dass ein zweiter Parameter die Anzahl der signifikanten Bits angibt. Wenn Sie die Bits umgedreht haben, verschieben Sie sie einfach nach rechts.

0

Versuchen Sie es mit Integer.reverse (int x);

Verwandte Themen