2010-03-25 8 views
5

바이트 반전을하려고합니다. 나는 그것은 (32 비트 시스템에서) 비트를 리버 수비트 반전을 사용하여 비트

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

아래의 코드를 사용하지만, 문제, 예를 들어, 입력 내가 10111110001를 얻으려면, 10001111101이지만,이 방법은있다 표제 0을 포함하여 전체 바이트를 뒤집을 수 있습니다. 출력은 10111110001000000000000000000000입니다. 실제 수치를 역전시킬 수있는 방법이 있습니까? 나는 그것을 문자열과 리버 서로 변환하고 다시 변환하고 싶지 않다. 어떤 순수한 수학 방법이나 비트 연산 방법이 있습니까?

최고 감사합니다,

+0

나는 귀하의 방법을 이해합니다 : 귀하가 u4를 사용하고 귀하의 예에서 그것을 정의하지 않았기 때문에 컴파일 할 수 없습니다. –

+0

int u4 = 0x0000FFFF; – user287792

+0

이것은 이유가 아니며, 나는 그저 그리워합니다. –

답변

1

치즈 맛이 나는 방법은 오른쪽에 1을 얻을 때까지 이동하는 것입니다 당신은 unsigned int에 모든 변수를 전환해야합니다. 당신이 옳은 시프트를하면 언제든지 쓸 수있는 표지 확장을 할 수 있습니다.

+0

무한 루프로 끝날 수 있으므로 삽입 된 값이 0인지 확인해야합니다. –

+0

서명 된 오른쪽 시프트에서 부호 비트가하는 일에주의하십시오. 구현 정의입니다. 아마도 질문자의 코드가 서명되지 않은 int를 사용하는 것으로 바뀌었을 것입니다. 서명해야 할 이유가 없으며 번거 로움을 감당할만한 가치가 없습니다. –

4

유사한 방법을 사용하여 오른쪽 (33)에 결과 비트를 이동 최상위 비트 번호를 가져 - #bits 봐라을!

0

한 가지 방법은 숫자 n의 부호 비트 수를 찾고 해당 숫자만큼 왼쪽으로 시프트 한 다음 위 알고리즘을 통해 실행할 수 있습니다.

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

참고 :

+0

이것은 잘못되었습니다 : 1000 (상위 비트 3)은 << 3이므로 10000000이되며 역으로 0x02000000이되며 1이 아닙니다! –

+0

@Ritsaert : 1000에는 24 개의 선행 부호 비트가 있으므로 3이 아닌 24로 이동하십시오. –

0

모든 32 비트가 중요하고 모든 것을 뒤집어 쓰고 있다고 가정합니다. 가장 높은 1을 찾음으로써 중요한 비트의 수를 추측 할 수는 있지만 반드시 정확하지는 않으므로 중요한 비트의 수를 나타내는 두 번째 매개 변수가 필요하도록 함수를 수정하는 것이 좋습니다. 그런 다음 비트를 반전 한 후 오른쪽으로 이동하십시오.

0

Integer.reverse (int x)를 사용해보십시오.

관련 문제