1byte가 8비트가 아닐경우도 고려해서 프로그램을 짜야하나요.
글쓴이: kkb110 / 작성시간: 토, 2004/12/04 - 6:18오후
STL에 시퀸스 컨테이너 요구사항을 만족시키는
컨테이너를 코딩중인데요.
동작하는 시스템이 1byte가 8bit가 아닐경우도 고려해서 프로그램을 짜야할까요?
제 컨테이너는 unsigned int 형식의 로그를 구해야하는데 간략한 코드는 이렇습니다.
unsigned indexfunc10 ( unsigned n )
{
if ( n > 0x80000000 ) return 32;
unsigned t, log2;
if ( n > 0x8000 ){log2 = 16;t = 0x800000;}else{log2 = 0;t = 0x80;}
if ( n > t ){log2 += 8;t <<= 4;}else{t >>= 4;}
if ( n > t ){log2 += 4;t <<= 2;}else{t >>= 2;}
if ( n > t ){log2 += 2;t <<= 1;}else{t >>= 1;}
if ( n > t ){log2 += 1;}
return log2;
}
unsigned를 이진수로 표현했을때 가장 윗자리수있는 1이 몇번째 있느냐 하는 문제와도 같죠.
근데 문제는 이게 1바이트가 8비트라는 가정을 한다는겁니다.
물론 잘 코딩해서 1바이트가 8비트가 아닐때도 잘동작하는 코드를 작성할수 있긴 한데 문제는 성능이 안나온다는거죠.
만약 여러분들이라면 어떤선택을 할지 궁금하군요. -_-;
Forums:
이 코드의 문제는 당장 unsigned가 4 byte라는 가정일 듯 싶은
이 코드의 문제는 당장 unsigned가 4 byte라는 가정일 듯 싶은데요?
대충 펜티엄3 800 기준으로 그런대로 빠른 코드였습니다. 앞부분을 lo
대충 펜티엄3 800 기준으로 그런대로 빠른 코드였습니다. 앞부분을 loop로 처리하면 되지 않을까요?
Byte 문제는 해결했습니다. if(size/2 != 0) {if
Byte 문제는 해결했습니다.
if(size/2 != 0) {if ((unsigned)index > i<<size/2) {i <<=size/2;j+=size/2;}}
if(size/4 != 0) {if (index > i<<size/4) {i <<=size/4;j+=size/4;}}
if(size/8 != 0) {if (index > i<<size/8) {i <<=size/8;j+=size/8;}}
if(size/16 != 0) {if (index > i<<size/16) {i <<=size/16;j+=size/16;}}
if(size/32 != 0) {if (index > i<<size/32) {i <<=size/32;j+=size/32;}}
if(size/64 != 0) {if (index > i<<size/64) {i <<=size/64;j+=size/64;}}
if(size/128 != 0) {if (index > i<<size/128) {i <<=size/32;j+=size/128;}}
이런 꼴로 하면 컴파일러가 알아서 최적화 시켜주더군요. unsigned 가 4byte 일때 위 코드와 이 코드는 vc7에서 정확히 같은 명령어를 생성해냈습니다.
바로위글 접니다. 허허 지울수도 없고 -_-;; 빠진부분이 있어서 올립니
바로위글 접니다. 허허 지울수도 없고 -_-;; 빠진부분이 있어서 올립니다.
unsigned int i=1;
char j=0;
const int size = stdnumeric_limits<unsigned char>digits * sizeof(T);
if(size/2 != 0) {if ((unsigned)index > i<<size/2) {i <<=size/2;j+=size/2;}}
if(size/4 != 0) {if (index > i<<size/4) {i <<=size/4;j+=size/4;}}
if(size/8 != 0) {if (index > i<<size/8) {i <<=size/8;j+=size/8;}}
if(size/16 != 0) {if (index > i<<size/16) {i <<=size/16;j+=size/16;}}
if(size/32 != 0) {if (index > i<<size/32) {i <<=size/32;j+=size/32;}}
if(size/64 != 0) {if (index > i<<size/64) {i <<=size/64;j+=size/64;}}
if(size/128 != 0) {if (index > i<<size/128) {i <<=size/32;j+=size/128;}}
오 저코드도 상당히 빠르네요!
감사합니다! ^^
정말 예리해요~ 한수 배우고 갑니다~
1바이트가 8bits 가 아닌 한가지 머신이 있었던걸로 기억합니다.메
1바이트가 8bits 가 아닌 한가지 머신이 있었던걸로 기억합니다.
메인프레인급이였나 아마 그랬던거 같군요. 9비트로 사용한 걸로
알고 있습니다.
요즘 대부분의 환경이라면 8비트가 맞을듯 하군요.
기계어 수준에서도 머신의 기본 연산 단위가 가장 빠르죠.
32비트 머신에서는 32비트가 기본 연산 단위라 1바이트로 충분한 데이타도
4바이트로 사용합니다. 효율을 위해 CPU 자체도 메모리 접근이 그 배수로
접근하게 만들어집니다.
---------
간디가 말한 우리를 파괴시키는 7가지 요소
첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스
이익추구를 위해서라면..
다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치
VMS 기종이었던가... 하여튼 메인프레임중에 1Byte=12bit인 기
VMS 기종이었던가... 하여튼 메인프레임중에 1Byte=12bit인 기종이 하나 있는걸로 압ㄴ다.
Written By the Black Knight of Destruction
저라면 스펙에 1 byte가 8bit가 아닌 환경에서는 동작을 보장하지
저라면 스펙에 1 byte가 8bit가 아닌 환경에서는 동작을 보장하지 않는다. 혹은 동작하지 않는다고 명시하고 나머지 환경은 무시하겠습니다.
오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.
오 답변들 감사합니다~ 정작 8비트가 아닌 시스템이 어떤기종인지 하나도
오 답변들 감사합니다~ 정작 8비트가 아닌 시스템이 어떤기종인지 하나도 몰랐었는데 ^^;
그리고 crimsoncream님 의견도 감사합니다 ^^
댓글 달기