컴퓨터/C_Programing

c언어 한글코드 확인 방법( & 0x80)

김치부침개21 2016. 1. 17. 23:13
반응형

출처 : http://blog.daum.net/natural_feel/4788772



0x80 에 대하여 ((c & 0x80)에 대하여)


0x80은 아래의 조건식에서 왜 사용되었을까라는 의문을 가지게 되면서 찾아보았다.

 

 

 

((c & 0x80) != 0) 

 

 

 

위의 식은 임의의 문자 C(알파벳 c가 아닌 변수명이다)가 한글인지 아닌지를 판단하는 조건식의 일부이다. c & 0x80 이 0이라면, 한글이 아닌것이고 0이 아니라면 한글인것이다. 

 

 

 

참고 : & 연산자 ( a & b 은 같은자리의 비트가 둘다 1일때 그 자리에 1을 표시한다, a는 1000 b는 

 

         1110 이라면 a&b는 1000이 된다) 

 


 

한글코드는 0x80 이상의 값을 가지고 있다. 0x80을 2진수로 바꾸주면 1000 0000 이 된다. 연산자 &를 사용해서 임의의 문자 c가 0x80이상인지를 확인하는것이다.  

 

 

 

c가 0x80 이상이라면, 1000 0000 보다 더 큰수(예를 들면, 1001 1100)이기 때문에 c & 0x80은 1000 0000 이 된다.  

 

c가 0x80 이하이라면, 1000 0000 보다 더 작은수(0111 1011)이기 때문에 c & 0x80은 0000 0000 즉 0이된다.  

 

그래서 (c & 0x80) 가 0이면 한글이 아닌것이고, (c & 0x80)가  0이 아니면 한글인것이다.

 

(주의할 점은 한글은 2byte 문자라는 점, 즉 1111 1111 보다 더 큰수를 생각할 필요는 없다)

 


 


 

---------------------------------------------------------------------------------------------------

 

뿐만 아니라 0x80은 8bit의 내용을 파악하는데 사용되기도 한다.

 

아래의 설명을 보면 쉽게 이해가 간다.

 


 

 

 

c = 0x80;

 

c = c >> b;
d= a & c;
if (d != 0)
    printf("1");
else 
    printf("0");

 

 

 

어 떤 8비트 수가 있다고 합시다. 이 값이 11001100 이라고 하면 이를 이진수 문자로 어떻게 표시할 수 있나요?

 

즉, 비트값이 1이면 1을 인쇄, 0이면 0을 인쇄하는 겁니다.

 

 

 

그럼 우선 어느 자리의 비트값이 0인지 1인지 알아야 하는데 인쇄하려면 우선 제일 끝 8자리 비트부터

 

확인해야 하겠지요?

 

 

 

그 러면 1인지 0인지 알기 위하여 다음과 같이 하면 됩니다.

 

 

 

원래 값 :                    a = 11001100

 

판단을 위해 만든 값 :  c = 10000000

 

두 개를 &하여 얻은값 : d =  10000000

 

 

 

즉, 원 a의 8번 비트가 0인지 1인지 알기 위하여 10000000 을 & 연산하였습니다. 이 결과가 0이면 비트8은

 

0, 결과가 0이 아니면 비트 8은 1이지요

 

 

 

그럼 7번 비트는 어떻게 판단할까요?

 

 

 

원 래 값 :                    a = 11001100

 

판단을 위해 만든 값 :  c = 01000000

 

두개를 &하여 얻은값 : d =  01000000

 

 

 

역 시 0이면 0 아니면 1

 

 

 

그럼 6번 비트는요?

 

 

 

원 래 값 :                    a = 11001100

 

판단을 위해 만든 값 :  c = 00100000

 

두개를 &하여 얻은값 : d =  00000000

 

 

 

역 시 0이면 0 아니면 1 이 경우 a의 6비트가 0이므로 1과 & 해도 0입니다. 고로 결과는 0이되어 0이 인쇄

 

 

 

이 런 식으로 8번 연산을 하는데 결국 c의 값을 보면 처음 8비트가 1인 상태(10000000)에서 01000000,

 

00100000, 00010000 ... 하여 결국 제일 마지막에는 00000001 로 되겠지요

 

고로 어느 비트를 1인지 판단하기 위하여 루프를 돌때마다 b 변수를 이용하여

 

 

 

c = 0x80 ;  // 이는 10000000 입니다.

 

c = c >> b; // 이렇게 하면 10000000 값이 원하는 b 위치 만큼 쉬프트 되어 b가 1이면 01000000 이 되지요

 

 

 

결국 님이 궁금해 하시는 두줄은 원래값 a와 & 연산으로 비트의 값이 0인지 1인지 알기 위해 사용되는

 

비트 패턴 c를 생성하기 위하여 수행하는 연산입니다.

 


 

참조 : http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=67753239&qb=YyAmIDB4ODA=&enc=utf8§ion=kin&rank=1&sort=0&spq=0&pid=f9TDOloi5TGssZn6TJssss--111175&sid=S9WldmRW1UsAAEPKSEw
 

반응형