오늘은 bit연산과 bit set 자료 구조에 대해 정리한 것을 올려봅니다.

어떤 상태정보를 저장하기 위해서 자료형을 선언해서 사용하는 방법은

C언어에서 당연한 방법이지만, 간단히 On Off 정보를 저장하기 위해서

char형 1byte, int형 4byte를 사용하는 것은 낭비입니다.


C++에서는 bitset class가 있어 이를 사용하면 되지만, 공부를 위해...

직접 만들어 봅니다. 제가 마이컴 코드를 배울 때는 대부분 이런 것들을

매크로로 만들어 사용하곤 했었는데요. 까먹기 전에 다시 정리해봅니다.


int LEDS 변수를 2진수로 하고 각 자릿 수가 LED0 ~ LED7의 on off상태를 

저장하는 것으로 구성한 코드입니다.

LEDS변수의 특정 자리를 OR 연산을 하면 특정 자릿수의 On을 설정할 수 있고,

LEDS변수의 특정 자리를 AND 연산을 하면, Off처리를 할 수 있습니다.


또한 아래의 if문장에서 처럼

And를 활용해서 bit의 상태를 확인할 수 있습니다.

i번째 자릿수의 bit가 on인지 off인지 확인하는 것이지요. 

" if(LEDS & (LED_ON << i)) "

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
#include <stdlib.h>
 
enum { LED0, LED1, LED2, LED3, LED4, LED5, LED6, LED7 };
enum { LED_OFF, LED_ON };
 
void main() {
    int LEDS = 0
 
// LED1번과 LED7번을 켠다.
    LEDS |= LED_ON << LED1;
    LEDS |= LED_ON << LED7;
 
    for (int i = 0; i < 32; i++) {
        if (LEDS & (LED_ON << i))
            printf("LED#%d ON\n", i);
        else
            printf("LED#%d OFF\n", i);
    }
 
// LED1번을 끈다.
    LEDS &= ~(LED_ON << LED1);    
 
    for (int i = 0; i < 32; i++) {
        if (LEDS & (LED_ON << i))
            printf("LED#%d ON\n", i);
        else
            printf("LED#%d OFF\n", i);
    }
}
 
cs



위의 내용을 논리 회로 형식으로 그려보면 아래와 같이 설명할 수 있습니다.

OR연산을 통해서 1을 OR해주면 켠 것은 그대로고, 꺼진 것은 켜집니다.

AND연산을 통해서 0을 AND해주면 끈 것은 그대로고, 켜진 것은 끕니다.


위의 AND연산에서 아래의 식은 특정 bit가 ON(high) 인지 OFF(low)인지

확인하기 위한 방법으로 사용될 수 있습니다. 확인하고 싶은 bit에 1을 ANd하면 그

bit의 결과만 뽑아볼 수 있지요.


0 & 1 = 0

1 & 1 = 1 

Posted by 고무함지
,