isdigit () 최고급 실현

나 는 프로 그래 밍 의 세계 에서 모든 것 이 다 있다 는 것 을 인정 할 수 밖 에 없다. 우리 의 창조력 은 무한 하고 말 할 수 없 는 것 이다!효율 만 언급 된다 면 영원히 가장 빠 르 지 않 고 더 빠 를 뿐이다!
    표준 C 에서 함수 int isdigit (int c) 가 문자 c 가 0 ~ 9 사이 의 숫자 인지 판단 할 수 있다 는 것 을 알 고 있 습 니 다.예 를 들 면:
int a = isdigit('1');    //a == 1
int b = isdigit('a');    //b == 0
int c = isdigit(3);      //c == 0

    isdigit 의 용 도 를 알 게 되면 우 리 는 문 제 를 던 질 수 있 습 니 다.
당신 은 어떻게 isdigit (int c) 를 실현 할 것 입 니까?
    나 는 절대 다수의 사람들의 첫 번 째 반응 과 최종 생각 은 모두 매크로 정 의 를 사용 하여 이 간단 한 함 수 를 실현 하 는 것 이 라 고 생각한다. 다음 과 같다.
#define isdigit(c) ((c) >= '0' && (c) <= '9')

    간결 하고 아름 답 습 니 다. 매크로 를 사용 하면 함수 호출 비용 도 절약 되 고 효율 도 떨 어 지지 않 습 니 다. 이것 이 가장 완벽 한 것 입 니까?Liux 커 널 에서 이 함 수 를 어떻게 실현 하 는 지 보 여 줍 니 다.
#define _U      0x01    /* upper */
#define _L      0x02    /* lower */
#define _D      0x04    /* digit */
#define _C      0x08    /* cntrl */
#define _P      0x10    /* punct */
#define _S      0x20    /* white space (space/lf/tab) */
#define _X      0x40    /* hex digit */
#define _SP     0x80    /* hard space (0x20) */
 
extern unsigned char _ctype[];

#define isdigit(c) ((_ctype+1)[c]&(_D))

unsigned char _ctype[] = {0x00,                 /* EOF */
 _C,_C,_C,_C,_C,_C,_C,_C,                        /* 0-7 */
 _C,_C|_S,_C|_S,_C|_S,_C|_S,_C|_S,_C,_C,         /* 8-15 */
 _C,_C,_C,_C,_C,_C,_C,_C,                        /* 16-23 */
 _C,_C,_C,_C,_C,_C,_C,_C,                        /* 24-31 */
 _S|_SP,_P,_P,_P,_P,_P,_P,_P,                    /* 32-39 */
 _P,_P,_P,_P,_P,_P,_P,_P,                        /* 40-47 */
 _D,_D,_D,_D,_D,_D,_D,_D,                        /* 48-55 */
 _D,_D,_P,_P,_P,_P,_P,_P,                        /* 56-63 */
 _P,_U|_X,_U|_X,_U|_X,_U|_X,_U|_X,_U|_X,_U,      /* 64-71 */
 _U,_U,_U,_U,_U,_U,_U,_U,                        /* 72-79 */
 _U,_U,_U,_U,_U,_U,_U,_U,                        /* 80-87 */
 _U,_U,_U,_P,_P,_P,_P,_P,                        /* 88-95 */
 _P,_L|_X,_L|_X,_L|_X,_L|_X,_L|_X,_L|_X,_L,      /* 96-103 */
 _L,_L,_L,_L,_L,_L,_L,_L,                        /* 104-111 */
 _L,_L,_L,_L,_L,_L,_L,_L,                        /* 112-119 */
 _L,_L,_L,_P,_P,_P,_P,_C,                        /* 120-127 */
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,                /* 128-143 */
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,                /* 144-159 */
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,                /* 160-175 */
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,                /* 176-191 */
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,                /* 192-207 */
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,                /* 208-223 */
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,                /* 224-239 */
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};               /* 240-255 */

    신기 하 죠? 전형 적 인 공간 을 시간 으로 바 꾸 는 방법.여기 서 간단 한 설명 을 하 겠 습 니 다. 우 리 는 문자 '0' ~ '9' 에 대응 하 는 ASCII 코드 가 48 ~ 57 이 고 위 에 비 친 을 알 고 있 습 니 다.ctype 배열 의 해당 위 치 는 모두D,_D&_D 는 진실 이기 때문에 '0' ~ '9' 에 대해 정확 한 판단 을 할 수 있다.나머지 는 이 범위 밖의 문 자 를 false 로 판단 하면 됩 니 다.여기 서 의 방법 이 정 수 된 점 은 바로 여기에 있다. 서로 다른 종류의 문 자 를 분류 하고 유일한 바 이 너 리 로 표 지 를 한다. 사용 & | 은 서로 다른 유형의 문자 가 두 가지 분류의 조건 을 동시에 만족 시 키 지 않도록 확보한다.
    글 끝 에 한 마디 하 자 면 시간 이 있 으 면 Liux 커 널 의 코드 를 많이 보 세 요. 왜냐하면 모두 여러 번 단련 된 것 입 니 다.아마도 많은 코드 가 당신 을 괴상 하 게 만 들 었 을 것 입 니 다. 그러나 hack 가 생각 을 내 놓 은 후에 얻 은 기쁨 도 말로 표현 할 수 없습니다.

좋은 웹페이지 즐겨찾기