블로그 이미지
fiadot_old

칼퇴근을 위한 게임 서버 개발 방법론에 대한 심도있는 고찰 및 성찰을 위한 블로그!

Rss feed Tistory
Technical Article/펌 2004. 8. 13. 11:52

간단한 바이트 정렬

간단한 바이트 정렬 6904 0 taehyun@sicc.co.kr 6904 0 0        


작 성 자 권태현(xogus2000)     첨부
파일  
작성시각 2004-08-11 오후 4:49:32 조 회 수 247
글 분 류 VC++ 일반  

뭐, 아주 중용한 내용은 아니고, 그냥 간만에 들어 온 기념으로 팁을 하나 남깁니다.



데이터를 처리하다 보면, 할당될 블럭의 크기가 4의 배수 또는 8의 배수여야 하는 경우가 종종 있습니다.

[현재 값보다 크거나 같은 4의 배수 중 최소값]을 찾아야 하는 경우입니다.



공유 메모리를 사용하면 특히 이런 처리가 많이 필요한데요, 이 경우 대부분 아래와 같은 코드를 사용하더군요.



if ((v % 4) != 0)

    v += 4 - (v % 4);



이게 틀린건 아니지만, 다음과 같은 매크로나 inline 함수를 정의해 사용하시면 훨씬 빠릅니다.



#define align4(v)   (((v) + 3) & 0xFFFFFFFC)



무슨 뜻인지 선뜻 이해가 안가시는 분들을 위해 약간의 추가 설명을 하자면,



n * 4 는 n << 2 를 뜻합니다.

즉, 4의 배수는 항상 left shift 2 가 수행된 결과가 된다라는 겁니다.



left shift 2 가 수행된 결과는 마지막 2비트가 항상 00 이 되기 때문에

현재 값보다 최대 3 (= 4 - 1)만큼 큰 값에서 마지막 2비트를 버리면, 이 값이

[현재 값보다 크거나 같은 4의 배수 중 최소값]이 된다는 겁니다.



마찬가지로 8의 배수는 마지막 3비트가 000인 값이므로,



#define align8(v)   (((v) + 7) & 0xFFFFFFF8)



와 같이 표현이 됩니다.
,
TOTAL TODAY