부호없는 32비트 정수를 받아서 그 비트 패턴을 뒤집어 출력한다. LSB부터 MSB로 각 비트를 0부터 31까지 번호를 붙이면, 0번 비트와 31번 비트를 서로 바꾸고, 1번 비트와 30번 비트를 서로 바꾸고, ..., 15번 비트와 16번 비트를 바꾸어 돌려준다.

실제 구현은, 우선 bswap을 이용해서 바이트 단위의 순서를 뒤집어 놓은 다음에 각 바이트 안에서 비트패턴을 뒤집는 방식을 사용한다. 각 바이트 안에서는, 우선 니블 순서를 뒤집고, 각 니블 안에서 인접한 2비트씩의 순서를 뒤집고, 마지막으로 2비트 안에서 인접한 비트의 순서를 뒤집는다. 마치 퀵소트 알고리즘처럼 두개의 그룹씩 순서를 바꾸어간다고 생각하면 코드를 이해하기 쉽다.

; uint32_t bitreverse(uint32_t a)
bitreverse PROC
        mov     eax,[esp+4]
        bswap   eax
        mov     ecx,eax
        and     eax,0f0f0f0fh
        xor     ecx,eax
        rol     eax,8
        or      eax,ecx
        mov     ecx,eax
        and     eax,33333333h
        xor     ecx,eax
        rol     eax,4
        or      eax,ecx
        mov     ecx,eax
        and     eax,55555555h
        xor     ecx,eax
        rol     eax,2
        or      eax,ecx
        ror     eax,7
        ret
bitreverse ENDP

bswap명령은 486이상에서 사용이 가능한 명령이므로 386에서 사용하려면 같은 효과를 내는 코드를 써야한다. 예를들어,

    xchg    ah,al
    ror     eax,16
    xchg    ah,al
이렇게 하면 386에서 bswap eax와 같은 결과를 얻는다.

대표적인 용도: 누구나 한번쯤은 숙제로 짜야하는 FFT 프로그램을 작성할 때 비트 패턴을 뒤집는 경우.

Posted by movsd
,