본문 바로가기

프로그래밍 -----------------------/C,C++ 팁

아스키 코드의 재미난 연산


출처 http://www.debuglab.com/knowledge/asciiop.html

아스키 코드의 재미난 연산


1.요약 

ASCII 코드는 총 126가지의 코드를 미리 정해놓은 문자 테이블입니다. 그런데, 이 ASCII 코드를 살펴보면 몇가지 재미난 점을 발견할 수 있습니다.(다들 아시나요? ^^) 


2.본문 


(1) 숫자 --> 문자로 변환 

우리가 사용하는 숫자는 10진수로 0부터 9까지의 수를 사용하여 모든 값을 표현하는 것입니다. 그런데, 실제로 0이라는 문자는 아스키 코드표에서는 30h(편의상 16진수에는 'h'를 붙이도록 합니다.) 즉, 48 이라는 값을 가리키고 있습니다. 그리고, 1은 31h 또는 49입니다. 그런데 자세히 보면 다음과 같은 연관성을 찾을 수 있습니다. 

숫자  아스키 코드 
0      30h 
1      31h 
2      32h 
3      33h 
4      34h 
5      35h 
6      36h 
7      37h 
8      38h 
9      39h 

즉, 아스키 코드의 뒷숫자와 10진수의 숫자가 서로 일치한다는 점입니다. 따라서, 원래의 십진수에 간단한 연산을 해주면 숫자에 해당하는 문자를 얻을 수 있습니다. 

저는 간단히 아래와 같은 함수를 만들었습니다. 물론, 그 반대의 경우도 가능합니다. 

원리는 입력받은 숫자값에 30h를 OR(|) 연산을 해주면 숫자에 해당하는 문자를 얻을 수 있는 것입니다. 


//************************************************ 
// NtoA() 
// Purpose : [ 숫자를 문자로 바꿉니다.] 
// Parameters : 
// [&n] : 바꾸고 싶은 숫자 ( 0 ~ 9 사이) 
//************************************************ 
inline void NtoA(int &n) 

    n |= 0x30
}




(2) 소문자 --> 대문자, 대문자 --> 소문자 

역시 (1)에서와 같은 원리입니다. 'A'는 아스키 코드 값으로 41h, 즉 65이며, 'a'는 아스키 코드값으로 61h, 즉 97 입니다. 자 그럼 보다 더 쉽게 이해하기 위해서 비트단위로 살펴보도록 하겠습니다. 

    8 7 6 5 4 3 2 1 (비트 위치) 
A : 0 1 0 0 0 0 0 1 
a : 0 1 1 0 0 0 0 1 

B : 0 1 0 0 0 0 1 0 
b : 0 1 1 0 0 0 1 0 


즉, 6 번째 비트값만 다를뿐 나머지는 같다는 것을 알수 있습니다. 이 원리를 이용하면 다음과 같은 함수를 만들 수 있습니다. 


//************************************************ 
// UtoL() 
// Purpose : [ 대문자를 소문자로 바꿉니다. ] 
// Parameters : 
// [&c] : 바꾸고 싶은 대문자 ( A ~ Z 사이) 
//************************************************ 
inline void UtoL(char &c) 

    c |= 0x20



//************************************************ 
// LtoU() 
// Purpose : [ 소문자를 대문자로 바꿉니다. ] 
// Parameters : 
// [&c] : 바꾸고 싶은 소문자 ( a ~ z 사이) 
//************************************************ 
inline void LtoU(char &c) 

    c &= 0xDF// ~(0x20) 
}