'Programming'에 해당되는 글 341건

  1. 2013.02.15 Bit Mask (비트 마스크)
  2. 2013.02.15 비트 쉬프트 연산자
  3. 2013.02.15 printf 함수의 서식문자 조합.
  4. 2013.02.15 isalpha 함수
  5. 2013.02.15 isdigit함수
  6. 2013.02.15 do~while문
  7. 2013.02.15 switch문의 적절한 예
  8. 2013.02.15 가변 인자 함수

비트 마스크 활용의 예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
:


비트 연산자는 정수일때만 해당사항!!! 실수 안됨.


<< 연산자 : 비트를 왼쪽으로 이동. (( <<쪽으로 이동할수록 값의 크기가 2배씩 증가.))

>> 연산자 : 비트를 오른쪽으로 이동. (( >>쪽으로 이동할수록 값의 크기가 2배씩 감소. 단, 홀수이면 나머지값 버려짐.))


 unsigned 형으로 표현되는 데이터는 >> 연산 시 왼쪽의 빈 공간을 무조건 0으로 채운다.

예를들어 unsigned int 형 변수에 저장된 값의 경우, 부호를 결정짓는 MSB가 존재하지 않는다. 따라서

가장 왼쪽에 존재하는 비트가 1로 채워지는 경우는 어떠한 환경을 불문하고 발생하지 않는다.



음의 정수를 양의 정수로 바꿔주는 프로그램. Not비트 연산자 이용.

2의 보수를 취하여 음수를 양수로 만들어준다.




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



정수를 입력받아 그것을 비트열로 출력하는 프로그램.



bits-1-i 에서 -1은  >>로 밀었을 때 num이 가지고 있는 첫번째  비트를 연산하게 끔 하기 위하여 -1을 하였다.

그리고 -i는 차츰 차츰 >> 연산자의 수를 줄여나가면서 비트연산을 하게끔 한다.

'Programming > C' 카테고리의 다른 글

typedef 를 이용한 이차원 배열 주소 값 반환  (0) 2013.02.15
Bit Mask (비트 마스크)  (0) 2013.02.15
printf 함수의 서식문자 조합.  (0) 2013.02.15
isalpha 함수  (0) 2013.02.15
isdigit함수  (0) 2013.02.15
Posted by scii
:

% # 7 .5 h d

         a     b        c      d


a = 출력의 형태에 조절을 가하기 위한 특별한 표시문자(flag)

b = 출력의 사용되는 최소한의 폭.

c = 정밀도(precision)

d = 출력 데이터의 크기정보 변경.


a : 총 5개가 있다. -, 0, + 공백, #

: -        좌측정렬.

: 0        빈 공간을 0으로 채우기

: +        출력할 수의 크기가 0보다 클 때 +기호 붙여주기

: 공백    출력할 수의 크기가 0보다 클 때 앞의 빈 칸 하나 출력.

: #        8진수, 16진수 출력 시 각각 0과 0x를, 실수의 경우 소수점 이하 0출력.


b : 폭(width)


: %5d 이렇게 하면 5칸의 공간을 할당하여 오른쪽 정렬된 결과를 출력한다.



c : 정밀도


: 정밀도는 출력되어야 하는 문자의 개수를 의미한다.

만약에 문자열의 길이가 서식문자의 정밀도보다 길다면, 정밀도의 크기에 맞춰서 문자열의 일부만 출력이 된다.



d : 출력 데이터의 크기정보 변경


ex) %ld, %lld, %lf



'Programming > C' 카테고리의 다른 글

Bit Mask (비트 마스크)  (0) 2013.02.15
비트 쉬프트 연산자  (0) 2013.02.15
isalpha 함수  (0) 2013.02.15
isdigit함수  (0) 2013.02.15
do~while문  (0) 2013.02.15
Posted by scii
:

isalpha 함수

Programming/C 2013. 2. 15. 02:19 |

isalpha 함수


: 인자로 전달되는 문자가 알파벳이라면 0이 아닌 값을, 알파벳이 아니라면 0을 반환한다.

이 함수도 호출을 위해 헤더파일 ctype.h를 포함해야 한다.





위의 함수와 똑같은 기능을 하는 함수를 만들어 보았다.




아니면

if((ch >= 'a'  && ch <= 'z') || (ch >= 'A' && ch <= 'Z'));

            return 1;

else

            return 0;

'Programming > C' 카테고리의 다른 글

비트 쉬프트 연산자  (0) 2013.02.15
printf 함수의 서식문자 조합.  (0) 2013.02.15
isdigit함수  (0) 2013.02.15
do~while문  (0) 2013.02.15
switch문의 적절한 예  (0) 2013.02.15
Posted by scii
:

isdigit함수

Programming/C 2013. 2. 15. 02:18 |

isdigit 함수


:숫자인지를 묻는 함수이다. 인자로 전달되는 문자가 한자릿수 숫자라면(숫자에 해당하는 문자라면) 0이 아닌 값을,

숫자가 아니라면 0을 반환한다.




isdigit 함수는 숫자에 해당하는 문자인 경우 0이 아닌 값을 반환한다. 그런데 0 이외에 값은 '참'으로 인식되기 때문에, 이 if문이 성립.




위에 함수 기능을 만들어 보았다.





문자는 정수형으로 치환되고 4바이트를 가지고 있기 때문에 int형으로 인자를 받는 것.


'Programming > C' 카테고리의 다른 글

printf 함수의 서식문자 조합.  (0) 2013.02.15
isalpha 함수  (0) 2013.02.15
do~while문  (0) 2013.02.15
switch문의 적절한 예  (0) 2013.02.15
가변 인자 함수  (0) 2013.02.15
Posted by scii
:

do~while문

Programming/C 2013. 2. 15. 02:15 |

do ~ while 문의 대표적인 활용사례.




조건검사를 뒷 부분에서 하는 것이 합리적인 상황을 연출하고 있다.


지금은 do~while문이 좋지만,  만약에 while문이나 for문으로 처리할 수 있는 것이라면 do~while문 보다 while이나 for문이 낫다.

'Programming > C' 카테고리의 다른 글

isalpha 함수  (0) 2013.02.15
isdigit함수  (0) 2013.02.15
switch문의 적절한 예  (0) 2013.02.15
가변 인자 함수  (0) 2013.02.15
수학 관련 함수  (0) 2013.02.15
Posted by scii
:

숫자를 입력하면 그 범위를 알려주는 프로그램.

#include <stdio.h>
#include <stdlib.h>

int Value(int);

int main(void)
{
      int num;

       printf("integer Input: ");
       scanf("%d", &num);

       switch(Value(num))
       {
        case -1 :
             puts("0미만의 수. \n");
             break;
       case 0 :
             puts("입력된 숫자는 0이상 10미만. \n");
             break;
       case 1 :
             puts("입력된 숫자는 10이상 20미만. \n");
             break;
       case 2 :
             puts("입력된 숫자는 20이상 30미만. \n");
             break;
       default :
             puts("30이상의 수. \n");
              break;
      }

      system("pause");
       return 0;
}

int Value(int val)
{
       if(val < 0)      
             return -1;
       else            
             return val/10;
}

적절하구나!! 

'Programming > C' 카테고리의 다른 글

isdigit함수  (0) 2013.02.15
do~while문  (0) 2013.02.15
가변 인자 함수  (0) 2013.02.15
수학 관련 함수  (0) 2013.02.15
ftell 함수와 rewind 함수  (0) 2013.02.15
Posted by scii
:

가변 인자 함수

Programming/C 2013. 2. 15. 02:10 |

가변 인자 함수(variadic function)



 int printf(const char *format, ...);

 int scanf(const char *format, ...);


printf 함수와 scanf함수의 원형를 예를 들어...

위의 원형에서 보면, 두 번째 매게 변수 선언이 "..."로 되어 있다. 이는 몇 개의 인자가 전달되건, 어떤 종류의 인자가 전달되건 개의치 않겠다는 선언이다.


따라서 printf와 scanf 함수의 선언은 첫 번째 인자로 반드시 문자열이 와야 하고(const char *format), 그 다음부터는 몇 개의 인자를 전달하건 상관하지 않겠다는 선언이다.




#include <stdio.h>

#include <stdarg.h> //가변 인자의 모든 함수 및 변수를 사용하기 위해서는 헤더 파일 stdarg.h를 포함해야 한다.


void va_fct(int a, ...);


main()

{

      va_fct(1, 1); //첫 번째 인자는 가변 인자의 갯수 정보를 전달한다.

      va_fct(2, 1, 2);

      va_fct(3, 1, 2, 3);


       return 0;

}


void va_fct(int a, ...)

{

       int i;

       va_list list;     //list 포인터. (va_fct함수 호출 시 전달된 매개 변수를 가리키는 일종의 지시자.)


       va_start(list, a);     //list 포인터 초기화. 

                               //(첫 번째 인자는 초기화할 va_list형 변수를, 두 번째 인자론 매개 변수로 전달된 첫 번째 인자를 전달.)

                             //(이 정보는 변수 list가 가변 인자의 첫 번째 요소를 정확히 가리키게 하기 위한 것.)

                       //※주의할 사항: 변수 list가 가리키는 첫 번째 인자라는 것이 메인함수에 있는 va_fct함수의 두 번째 인자이다.


       for(i=0; i<a; i++)

             printf("%d ", va_arg(list, int));     //va_arg함수를 호출하면서 변수 list를 인자로 전달하고 있다.

                                                          //이는 현재 list가 가리키고 있는 가변 인자를 반환하기 위한 것.

                                                         //두 번째 인자로는 가변 인자의 자료형 정보를 넘겨줘야만 한다.

                                                        //함수 호출이 완료되고 나면 변수 list는 다음 번 가변 인자를 가리키게 된다.

       printf("\n");


       va_end(list);     //list 리셋. (가변 인자를 모두 참조했다면 반드시 거쳐야 하는 과정.)

}


'Programming > C' 카테고리의 다른 글

do~while문  (0) 2013.02.15
switch문의 적절한 예  (0) 2013.02.15
수학 관련 함수  (0) 2013.02.15
ftell 함수와 rewind 함수  (0) 2013.02.15
2차원 배열 동적할당.  (2) 2013.02.15
Posted by scii
: