글
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)
와 같이 표현이 됩니다.
작 성 자 권태현(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)
와 같이 표현이 됩니다.
![](https://lh3.googleusercontent.com/-hYZb_novCPQ/V5HuGPkGFUI/AAAAAAAAANk/f8zcKkeTBbA1A-W6yuqfk12fs8bd8FeOQCL0B/banner_468_60.png)
RECENT COMMENT