2010-03-25 15 views
5

Próbuję odwrócić bit w bajcie. Używam poniższy kodBit Reversal bitwise

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; 
} 

Może Zwrotnik bit (na komputerze 32-bitowym), ale nie jest to problem, Na przykład wejście jest 10001111101, chcę dostać 10111110001, ale ta metoda odwróci cały bajt, łącznie z pozycją 0. Na wyjściu jest 10111110001000000000000000000000. Czy istnieje metoda odwrócenia rzeczywistej liczby? Nie chcę przekonwertować go na ciąg i rewerser, a następnie przekonwertować ponownie. Czy istnieje czysta metoda matematyczna lub metoda operowania bitem?

Pozdrawiam,

+0

Chociaż rozumiem twoją metodę: nie można skompilować, ponieważ używasz u4 i nie zdefiniowałeś tego w swoim przykładzie. –

+0

Dodaj int u4 = 0x0000FFFF; – user287792

+0

To nie jest powód, po prostu tęsknie. –

Odpowiedz

1

Chichot sposobem jest przesunięcie aż pojawi się 1 na prawej:

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

Uwaga: Należy przełączyć wszystkie zmienne do unsigned int. Jak napisano, możesz mieć niechciane rozszerzenie znaku, gdy tylko zmienisz prawą stronę.

+0

Powinieneś sprawdzić, czy wprowadzona wartość wynosi zero, ponieważ możesz skończyć z nieskończoną pętlą. –

+0

I uważaj na to, co bit znaku ma na podpisanej prawej zmianie, jest zdefiniowany przez implementację. Prawdopodobnie właściwym jest, aby kod pytającego zmienił się na niepodpisany int: nie ma powodu, aby go podpisywać i nie jest to warte kłopotów. –

4

uzyskać największą liczbę bitowej przy użyciu podobnego podejścia i zmiany wynikające bitów w prawo 33 - #bits i voila!

0

Jedną z metod może być znalezienie wiodącej liczby bitów znaków w liczbie n, przesunięcie w lewo n o tę liczbę, a następnie uruchomienie przez powyższy algorytm.

+0

To jest złe: 1000 (wysoki bit 3) staje się << 3, a zatem 10000000, a odwrotnie jest to 0x02000000, a nie 1! –

+0

@Ritsaert: 1000 ma 24 wiodące bity znaków, więc przesuwasz je 24, a nie 3 –

0

Zakłada się, że wszystkie 32 bity są znaczące i cofają całość. MOŻESZ spróbować zgadnąć liczbę znaczących bitów, znajdując najwyższą wartość 1, ale to niekoniecznie jest dokładne, więc sugerowałbym zmodyfikowanie funkcji, tak aby miała drugi parametr wskazujący liczbę znaczących bitów. Następnie po odwróceniu bitów po prostu przesuń je w prawo.

0

Spróbuj użyć Integer.reverse (int x);