비트 연산자

프로그래밍/C/C++ 2014. 2. 12. 14:17

비트 연산자의 필요성

8개의 LED조명을 제어하기 위한 프로그램을 생성한다고 할때

  enum {LED0 = 0, LED1, LED2, LED3, LED4, LED5, LED6, LED7};

  enum {LED_OFF = 0, LED_ON = 1};

  char mmio[8] = {0, }; // 8개의 배열을 만든뒤

  mmio[LED1] = LED_ON; //LED1의 조명 ON

  mmio[LED3] = LED_OFF; //LED3의 조명 OFF 

로 조명을 제어 할수 있습니다.

하지만 이 부분에서의 문제점은 총 8개의 비트(0, 1)만으로 충분하지만, 사용 메모리 크기는 8비트 * 8개(64비트)

공간을 할당하여 사용하고 있다는 것입니다. 각 char형의 1비트 밖에 사용하지 않고 7비트트 * 8개(56비트)의

공간이 낭비되고있는 문제점입니다.

 

이 문제를 해결하기 위해서는 8비트를 사용하여 8개의 LED를 제어하는 방법을 사용하여야합니다.

char 형의 문자형을 하나 사용하여 8비트(1바이트) 공간을 사용하는 방법을 소개합니다.

이 문제를 해결하기 위해서는 비트연산자를 활용해 각 비트의 연산이 필요합니다.

 

1. AND연산

 

 

AND연산은 위 그림과 같이 1과 1이 입력될때만 1이 출력되고 그 외의 연산은 0이 출력되는 게이트를 말합니다.

 

2. OR연산

 

 

 

OR연산은 위 그림과 같이 0과 0이 입력될때만 0이 출력되고 그 외의 연산은 1이 출력되는 게이트를 말합니다.

(입력 게이트로 하나라도 1이 포함되면 1이 출력)

 

3. NOT연산

NOT연산은 위 그림과 같이 0을 NOT연산자를 취하면 1이 출력되고, 1을 NOT연산자를 취하면 0이 출력됩니다.(반대로 출력)

 

4. SHIFT 연산

  데이터 << 이동할 비트 수

 데이터 >> 이동할 비트 수

 

SHIFT연산은 메모리 상을 비트 단위로 이동하는 것을 말합니다. 데이터를 비트 단위로 좌, 우로 이동하는

기능을 합니다.

규칙1. 특정 비트를 설정하려면 OR연산자를 사용합니다.

 char mmio = 0; // 0000 0000

규칙2. 특정 비트를 검색하려면 AND연산자를 활용합니다.

규칙3. 특정 비트를 초기화하려면 &연산자와 비트 반전 연산자(~, NOT)을 사용합니다.

 

 

 

 

'프로그래밍 > C/C++' 카테고리의 다른 글

C++ 파일 입출력  (0) 2014.02.24
함수 주요 형태(_stdcall, _cdecl, _fastcall)  (0) 2014.02.24
함수 포인터  (0) 2014.02.12
[STL]컨테이너 선택  (0) 2014.02.09
[STL] 제네릭 알고리즘 Generic Algorithm  (0) 2014.02.09

함수 포인터

프로그래밍/C/C++ 2014. 2. 12. 04:22

우리가 알고있는 일반적인

함수의 선언은 리턴타입 (함수명 ([파라미, ...])) 형식을 갖습니다.

함수의 포인터 선언 방법은 함수의 심볼은 반드시 리턴 타입과 매개변수 사이에 위치해야 합니다.

함수의 포인터 선언은 리턴타입 (*포인터명) ([파라미터, ...]) 형식을 갖습니다.(괄호 필수,

미괄호시 파라미터 부터 해석해서 리턴타입을 리턴타입을 포인터로 리턴하는 함수로 인식합니다.)

함수호출, 함수의 포인터 호출 방법은 아래와 같습니다.

 


하지만 이러한 방법은 매우 복잡합니다. 함수의 포인터 호출 방법을 아무도 사용하지 않을 것입니다.

하지만 전처리기 #define문을 사용해 함수의 포인터를 간단히 치환할수 있습니다.

 

출력 결과

 called foo(10);

 called foo(10);

 called foo(10);

 called foo(10);

 

위의 주석으로 처리된 함수 포인터는 #define선언된 함수의 포인터 타입으로 변경되어 간단히 사용할수 있습니다.