본문 바로가기

C++/Reference

[C++] 비트 단위로 제어하기

반응형

비트 필드는 구조체와 흡사하나 구조체는 byte 단위로 멤버를 사용할 수 있지만 비트 필드는 bit 단위로 멤버를 사용할 수 있다.

그래서 많은 상태를 저장하거나 bit별로 제어해야 하는 경우에 비트 필드를 사용한다.

비트 필드의 멤버는 unsigned형(unsigned int형)과 int형의 멤버를 가질 수 있고 비트 필드 변수의 크기는 int형 크기와 같은 4byte(32bit)이다.

signed와 unsigned는 char, short, int, long 등의 자료형 앞에 사용되어 부호가 있는 정수와 부호가 없는 정수를 나타내는 자료형으로 사용되며 signed는 보통 생략하여 사용한다.

비트 필드처럼 unsigned가 단독으로 사용되면 unsigned int형을 간략하게 표현한 형태이다.

다음은 비트 필드를 사용하여 1bit씩 제어하는 예제이다.

#include <stdio.h>
#include <string.h>

struct _bitfield
{
    unsigned b0:1;
    unsigned b1:1;
    unsigned b2:1;
    unsigned b3:1;
    unsigned b4:1;
    unsigned b5:1;
    unsigned b6:1;
    unsigned b7:1;
};

void main()
{
    struct _bitfield bit;
    
    memset(&bit, 0, sizeof(struct _bitfield));
    bit.b0 = 1;
    bit.b7 = 1;
    
    printf("%d\n", sizeof(struct _bitfield));
    printf("%08x %d\n", bit, bit);
}


memset() 함수를 사용하여 bit 변수 4byte를 0으로 초기화하고 bit.b0와 bit.b7을 1로 만들어 결과는 0x81이 된다. bit 변수는 32bit 중 8bit만을 사용한다.

다음은 비트 필드를 사용하는 두 번째 예제이다.

#include <stdio.h>
#include <string.h>

typedef struct _bitfield
{
    unsigned b0:1;
    unsigned   :7;
    unsigned b8:1;
    unsigned   :7;
    unsigned b16:1;
    unsigned    :7;
    unsigned b24:1;
    unsigned    :7;
} BITFIELD;

void main()
{
    BITFIELD bit;
    
    memset(&bit, 0, sizeof(BITFIELD));
    bit.b0 = 1;
    bit.b8 = 1;
    bit.b16 = 1;
    bit.b24 = 1;
    
    printf("%d\n", sizeof(bit));
    printf("%08x %d\n", bit, bit);
}

b0(1bit 사용) 다음의 멤버의 이름이 없어 7bit를 사용하지 않고 b8(1bit 사용) 다음의 멤버의 이름이 없어 7bit를 사용하지 않고 b16(1bit 사용) 다음의 멤버의 이름이 없어 7bit를 사용하지 않고 b24(1bit 사용)를 사용하므로 출력 결과는 0x1010101이다.

다음은 비트 필드를 사용하여 4byte 중 1byte씩 제어하는 예제로 각각 'a', 'b', 'c', 'd' 문자가 눌리면 문자에 해당하는 1byte씩을 on/off 한다.

#include <stdio.h>
#include <string.h>
#include <conio.h>

typedef struct _bitfield
{
    unsigned D:8;
    unsigned C:8;
    unsigned B:8;
    unsigned A:8;
} BITFIELD;

void main()
{
    BITFIELD bit;
    int bContinue = 1;
    
    memset(&bit, 0, sizeof(BITFIELD));
    
    while(bContinue)
    {
        printf("%08X\n", bit);
        
        switch(getch())
        {
        case 'a' : case 'A' :
            bit.A ^= 0xFF;
            break;
        case 'b' : case 'B' :
            bit.B ^= 0xFF;
            break;
        case 'c' : case 'C' :
            bit.C ^= 0xFF;
            break;
        case 'd' : case 'D' :
            bit.D ^= 0xFF;
            break;
        default :
            bContinue = 0;
        }
    }
}


main() 함수는 'a', 'b', 'c', 'd' 문자이면 프로그램을 실행하고 아니면 종료한다. BITFIELD bit의 각 1byte씩을 문자에 따라 '^' 연산자를 사용하여 on/off 시킨다.

반응형