비트 마스크 활용의 예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비트 형태를 출력하는 함수를 비트마스크를 이용하여 작성.



비트 마스크는 변수 또는 수식의 원하는 비트를 추출하기 위해 사용하며 특정 한 비트만을 1로 가지도록 사용된다.
예를 들면, int형 자료의 오른쪽에서부터 5번째 비트가 0인지 1인지를 알아보기 위한 비트 마스크는 16진수 상수 0x10이다. 
위에서는 우측에서 16번째 비트만이 1인 값 즉, 0x8000을 bitmask의 초기값으로 사용하고 있다. 따라서 비트별로 논리곱을 구하는 연산자 &를 이용할 수 있다.


마스크 사용 비트 처리

#define BIT0  01
#define BIT1  02
#define BIT2  04
int flg:
   flg |= BIT0;                  //(1)
   if((flg & BIT1) == 0)       //(2)

(1)은 변수 flg 내의 비트들에 대하여 BIT0에 대응하는 1비트 필드를 1로 만든다. 

(2)의 if문은 변수 flg 내의 BIT1에 대응하는 1비트의 필드가 0인지 아닌지를 평가하는 문장이다.

Posted by scii
: