부호없는 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 프로그램을 작성할 때 비트 패턴을 뒤집는 경우.