비트 마스킹은 다음과 같이 세 가지로 정리된다.

       ❶ 특정 비트를 0으로 만든다. (reset)

       ❷ 특정 비트를 1로 만든다. (set)

       ❸ 특정 비트을 반전시킨다. (toggle)

특정한 비트를 0으로 만들려면 0과 AND연산을 하면 되고 1로 만들려면 1과 OR연산을 하면 된다. 반전시키려면 1과 XOR연산을 취하면 된다. 다음 표에 이것을 정리하였다.

[표 1] 비트 마스크의 종류


x

x&0

0

0

1

0



x

x|1

0

1

1

1



x

x^1

0

1

1

0


이러한 비트 연산 특성을 이용하면 이진수의 특정위치의 비트들을 강제로 1, 0으로 만들거나 혹은 반전시킬 수 있으며 마이크로콘트롤러의 프로그래밍에서 사용빈도가 매우 높은 기법이다.

 비트 이동연산자 << 를 마스킹기법과 조합하여 사용하여 원하는 하나의 비트를 조작하기도 한다. 예를 들어서 unsigned short형 변수 usA가 0xa00b일 때 다른 비트값들은 그대로 유지한 채 8번 비트(b8)만 강제로 1로 만들고 싶다면 다음과 같이 하면 된다.


unsigned short usA = 0xa00b;
usA |= (1<<8);


여기서 (1<<8)의 결과는 이진수로 표시하면 0b 0000 0001 0000 0000 이며 b8만 1로 세트된 데이터이다. 반대로 n번 비트를 0으로 만들고 싶다면 ~(1<<n)과 AND연산을 하면 되고(1<<n 을 반전시켰음에 유의하라), n번 비트를 반전시키려면 (1<<n)과 XOR연산을 취하면 된다.


unsigned short usA = 0xa00b;
usA &= ~(1<<8); //8번 비트만 0으로 만든다


unsigned short usA = 0xa00b;
usA ^= (1<<8); //8번 비트만 반전한다.


 이러한 방법은 특정한 비트가 0인지 1인지를 조건 검사할 경우에도 사용된다. 만약 unsigned char형 변수 ucVar의 6번 비트(b6)가 0인지를 검사하려면 다음과 같이 조건 검사를 하면 될 것이다.


if (ucVar & (1<<6) == 0 ) {
   ...
   // ucVar 의 6번 비트가 0일 경우 수행할 명령들
   ...
} else {
   ...
   // ucVar 의 6번 비트가 1일 경우 수행할 명령들
   ...

}


일반적으로 n번 비트가 0인지를 조사하려면 (1<<n)과 변수와 and연산을 취하여 그 결과가 0인지 검사하면 된다. 이 조건이 거짓이라면 그 비트는 1이라는 결론을 얻을 수 있다.



Posted by 살레시오
,
  1. 화면의 첫 번째 줄에는 영문 이름을, 두 번쩨 줄에는 학번을 표시하고 세 번제 줄에는 생년월일을 출력하는 프로그램을 작성하라.


  1. 정수형 변수 a, b, c 를 각각 선언하고 a에는 1, b에는 2를 대입한 후 c 에는 a와 b의 곱을 대입하는 프로그램을 작성하라. (두 수의 곱은 ‘*’ 연산자를 사용한다.)


  1. 10진수 32456을 16진수로 표시하고 16진수 A9B7 을 10진수로 표시하는 프로그램을 작성하라. 또한 2진수 110011110010을 10진수로 표시하라.


  1. float형 변수 pi 에 원주율(3.141592)를 저장하고 float형 변수 e 에 자연상수(2.718281)울 저장하라. 그리고 그 수를 float형 변수 sum에 저장하라.


  1. 자연상수(2.718281...)를 E라는 상수로 정의하라. 그리고 원주율(3.141592)를 PI로 정의하라. 이후에 float형 변수 sum을 두 수의 합으로 초기화하라. 문제 4번 과의 차이점이 무엇인가 설명하라.


  1. 숫자값인 164 을 계산해서 화면에 십진수와 16진수로 표시하는 프로그램을 작성하라.


  1. sizeof 연산자는 주어진 데이터형의 바이트수를 반환해주는 매크로이다. 예를 들어서 sizeof(short)는 short형이 2바이트를 차지하기 때문에 2를 반환한다. 이것을 이용하여 char, short, int, long, long long, float, double, long double 형의 바이트 수를 화면에 모두 표시하는 프로그램을 작성하라.



Posted by 살레시오
,

 C/C++ 에서 typedef명령은 데이터형을 식별자로 대체하여 사용하게 해주는 명령이다. (type definition 두 단어를 조합해서 만든 듯 하다.)  다른 포스트에서 설명한 #include, #define 과 같은 전처리 명령어와 달리 #이 붙지 않고 끝에 세미콜론 ; 이 붙는다는 점에 유의하자.


 예를 들면 다음과 같다.


typedef unsigned char uchar;
typedef int INCHES, FEET;
typedef unsigned long size_t;


첫 번째 줄의 예를 보면 unsigned char 형을 uchar라는 새로운 이름(식별자)으로 정의하였고 두 번째 줄은 int 형을 INCEHES와 FEET라는 새로운 이름으로 정의하였다. 이후로는 다음과 같이 변수를 정의할 수 있다.


uchar ucA, ucB = 10; // unsigned char 형
INCHES length, width; // int 형


여기에서 ucA와 ucB는 unsinged char형이고 length와 width는 int형 변수이다.


  이렇게 이름을 새로 정의함로써 얻어지는 장점들은 다음과 같다.


❶ 긴 이름의 데이터형을 짧은 이름으로 대체할 수 있다.

❷ 자료형에 추가적인 의미를 부여할 수 있다.

또한 이 typedef명령어는 나중에 소개할 열거형(enum)과 구조제(struct)와 조합해서 자주 쓰이기도 한다.



Posted by 살레시오
,