혹시 풀어본 사람을 위해서 문제에서 찾아볼 수 있는 issue를 정리합니다.

 

풀이 도중인 사람은 나중에 보시고, 안풀어봤어도 정리하고픈 사람은 보세요.

 

issue 1) char는 문자연산에만 사용되는거 아닌가?

 

char형 변수가 숫자 연산에 사용되는 것이 낯설수도 있습니다.

 

char형은 문자나 문자열을 출력하는데 주로 쓰이기 때문입니다. 그렇지만 char 역시 숫자일 뿐입니다.

 

printf("%c", 97);

printf("%c", 'a');

 

둘의 결과는 동일합니다. 'a'라는 문자는 97이라는 숫자로 약속이 되어있는겁니다. (ASCII 코드)

 

char 타입을 문자에만 쓰는 것이 아니라는 것을 알고나면, 이제는 무조건 int로 변수를 선언할 필요 없습니다.

 

int는 4byte, char는 1byte이므로 0~255까지의 데이터를 처리하는데 char 타입을 쓰는 것이 메모리 절약에 도움이됩니다.

 

어떤 경우에는 데이터의 범위를 명시하기 위해서, 1byte 데이터를 처리할 때에는 char 타입을 사용하기도 합니다.

 

 

issue 2) bit operation

 

컴퓨터에서 사용하는 수들은 이진수로 표현이 가능합니다. c언어에서도 이진수 단위로 데이터를 조작하는 것이 가능합니다.

 

프로그램을 짜면서 수를 이용해야할 때 "a = 8"의 형태는 많이 보고, 사용하지만 "a = 1 << 3"같은 형태는 낯선 경우가 많습니다.

 

"<<" 의 뜻은 모든 bit를 왼쪽으로 한 칸씩 밀라는 뜻인데 결과적으로 x2 하는 효과를 얻습니다.

 

 "a = 1 << 3" 은 결과적으로 8인데 과정은 아래와 같습니다.

 

상태1: 처음 1

0000 0001

 

상태2: 1 << 1 (한칸 밀리다.)

0000 0010

 

상태3: 1 << 2 (두칸 밀리다.)

0000 0100

 

상태4: 1 << 3 (세칸 밀리다.)

0000 1000

 

위 결과, 이진수를 십진수로 바꾸면 8이 됩니다.

 

반대로 ">>"도 있는데 예상대로 %2 (나누기 2) 하는 효과를 보게됩니다.

 

대표적인 bit 연산자에는 '&'(AND) 와 '|'(OR)가 있습니다.

 

0000 0000과 0000 1001 을 AND 시키면 0000 0000이 되고, OR 시키면 0000 1001이 됩니다. (논리회로나 이산수학 때 배우는데로..)

 

이런 연산들은 데이터를 "일부bit"만 사용할 때 유용할 수 있습니다. 무슨 말이냐면, c언어에서 정의할 수 있는 가장 작은 크기의 변수형은

 

char입니다. 이건 1byte (8bit)짜리인데, 우리가 처리해야할 데이터는 4bit짜리라고 칩시다.

 

여기에 우리가 처리해야할 데이터가 2개 있다고 가정해봅시다.

 

data1: 0011

data2: 0101

 

물론 2개의 char 변수를 선언해서 처리해도 되지만, 하나의 변수에 두 개의 데이터를 저장할 수 있다면 메모리를 절약할 수 있습니다.

 

방법 1) char a = data1, b = data2;

 

방법 2) char a;

 

             a = data1 << 4;

             a |= data2 & 0xf

 

방법1은 이해가 쉬운데, 방법2는 조금 어렵습니다. 그 과정은 다음과 같습니다.

 

a = data1 << 4;  

 

0000 0011 -----> 0011 0000

 

data2 & 0x0f

 

0101

1111

------

0101 (AND)

 

a |= data2 & 0xf

 

0011 0000

0000 0101

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

0011 0101 (OR)

 

결과를 보면 상위 4bit에는 data1이, 하위 4bit에는 data2가 저장된걸 확인할 수 있습니다.

 

이런 원리들은 네트워크에서 주소를 판별 할 때 서브넷마스크를 이용하는 방법에서도 볼 수 있습니다.

 

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

 

한번씩 봐두면 나중에 도움이 될거라고 생각합니다.

 

학교에서 배웠던 지식이나 한 번씩 봤던 것들이 죽은 지식이 아니더라구요..

 

(첨부파일은 답안 중 하나)

01' 기장, 02년 회장, 지금은 그냥 마이너스 존입니다.