2013-02-20 1 views
2

내가 링크 http://pvtridvs.net/pool/bithacks.html#BitReverseObvious을보고 여기에 코드를 게시 :리버스 비트 확실한 방법

unsigned int v;   // reverse the bits in this 
unsigned int t = v;  // t will have the reversed bits of v 
int i; 

for (i = sizeof(v) * 8 - 1; i; i--) 
{ 
    t <<= 1; 
    v >>= 1; 
    t |= v & 1; 
} 

누군가의 도움이 왜이 모양-간단한 알고리즘 작동 조금 설명 할 수 있을까요? 필자는 종이에서 가장 간단한 예제들, 예를 들어 4 비트 0011 등을 테스트했지만, 왜이 3 행의 쉬프트와 비트 단위 연산이 그것을 성취 할 수 있는지 이해하지 못합니다. 그것은 t의 낮은 위치에 v의 낮은 위치의 "OUT"비트 "의"를 이동

+0

URL에 "첫 번째 방법에는 약 18 회의 작업이 필요합니다 ..."라고 나와 동의하지 않습니다. 첫 번째 방법은 반복 당 6 개의 작업을 수행하고 다른 180 개의 작업에는 32 개의 반복을 수행합니다. –

답변

4

감사합니다. 변수를 비트 스택으로 생각하십시오. v에서 비트를 팝핑하고 t으로 푸시합니다. 한 목록에서 빠져 나와 처음에 비어있는 다른 목록으로 밀어 넣는 것은 모든 목록을 되돌릴 수있는 간단한 방법입니다. 초기화는 결과에 최하위 비트의 초기 "푸시 (push)"를 수행합니다. 이 트릭은 강아지와 푸시 (즉, 오른쪽과 왼쪽 교대)를 저장합니다. 예 : 바이트의 경우 7 번만 더 누르면됩니다.

+0

"t 초기화는 쓸모가 없습니다." 사실이 아닙니다. 'v'의 최하위 비트를 얻으려면 필수적입니다. –

+0

사실 충분합니다. 죄송합니다. – Gene

0

각 라운드 t은 한 위치 위로 이동하고 v은 한 위치 아래로 이동합니다. 현재 마지막이지만 v의 끝은 t의 끝에 있습니다.

관련 문제