Bit Mask (비트 마스크)
Programming/C 2013. 2. 15. 02:27 |비트 마스크 활용의 예2
비트 마스크를 추가해서 다시 한번 짜본 비트 마스크 활용 예.
#include<stdio.h>
#define ADD 1 //00000000 00000001 //status를 씌우기 위한
#define MIN 1<<1 //00000000 00000010 //비트 마스크들.
#define MUL 1<<2 //00000000 00000100
#define DIV 1<<3 //00000000 00001000
#define KIND 1<<4 //00000000 00010000
int status;
void Set_Status(int);
void Show_Result(int, int);
int main(void)
{
int n1, n2;
fputs("연산할 정수 2개 입력: ", stdout);
scanf("%d %d", &n1, &n2);
Set_Status(ADD | MIN | MUL | DIV | KIND);
Show_Result(n1, n2);
Set_Status(MUL | DIV); //KIND, MUL, DIV 설정 안함.
Show_Result(n1, n2);
return 0;
}
void Set_Status(int ste)
{
if(KIND & ste) //KIND가 있으면
puts("\n구어체로 설정되었습니다.\n");
else
puts("\n수식으로 설정되었습니다.\n");
status = ste; //전역변수 status에 ste의 값을 씌움.
} //MUL | DIV를 인자로 받으면 00001100 이 됨.
void Show_Result(int n1, int n2)
{
if(status & KIND) //KIND있으면 구어체로
{
if(status & ADD)
printf("%d 더하기 %d 의 값: %d \n", n1, n2, n1+n2);
if(status & MIN)
printf("%d 빼 기 %d 의 값: %d \n", n1, n2, n1-n2);
if(status & MUL)
printf("%d 곱하기 %d 의 값: %d \n", n1, n2, n1*n2);
if(status & DIV)
printf("%d 나누기 %d 의 값: %d \n", n1, n2, n1/n2);
}
else //KIND없으면 수식으로
{
if(status & ADD)
printf("%d + %d = %d \n", n1, n2, n1+n2);
if(status & MIN)
printf("%d - %d = %d \n", n1, n2, n1-n2);
if(status & MUL)
printf("%d * %d = %d \n", n1, n2, n1*n2);
if(status & DIV)
printf("%d / %d = %d \n", n1, n2, n1/n2);
}
}
한 번의 함수 호출로 둘 이상의 특성을 설정할 수 있어서 Show_Result 함수의 동작방식을 지정하기가 수월하다.
이는 Show_Result 함수의 실행에 영향을 미치는 설정 정보가 열 개가 되건, 스무 개가 되건, 설정 정보를 저장할 변수 하나와 정보를 변경하는 기능의 함수 하나만 있으면 된다는 사실을 의미한다. (다만, 비트 마스크의 개수가 늘어 날 뿐이다.)
※ "설정해야 할 정보가 많이 필요한 상황에서는 비트 마스크 방식을 선택하자."
비트 마스크를 가지고 소스코드를 작성 안했다면 너무 난잡해 졌을 것이다. 총 다섯개의 변수를 선언해야 하고, 다섯개의 함수도 정의해야 한다.
그런데, 비트 마스크를 활용함으로써 코드가 가독성있고 깔끔하게 작성됐다.
또한, 위의 장점에 비하면 미미한 장점이지만 메모리 공간도 절약되었다.
비트 연산자와 비트 마스크를 잘만 활용하면 정말 편리하겠는데~!! 애용해야겠다.
----------------------------------------------------------------------------------
int 형 데이터는 32비트를 차지한다. int 형 데이터의 하위 16비트 형태를 출력하는 함수를 비트마스크를 이용하여 작성.
'Programming > C' 카테고리의 다른 글
힙에 할당된 메모리의 확장 시 호출하는 realloc 함수. (0) | 2013.02.15 |
---|---|
typedef 를 이용한 이차원 배열 주소 값 반환 (0) | 2013.02.15 |
비트 쉬프트 연산자 (0) | 2013.02.15 |
printf 함수의 서식문자 조합. (0) | 2013.02.15 |
isalpha 함수 (0) | 2013.02.15 |