본문 바로가기
프로그래밍/C

C ] 비트필드와 공용체 사용

by eteo 2023. 5. 29.

 

 

#include <stdio.h>
#include <stdint.h>

typedef struct {
    uint32_t bit1 : 1;
    uint32_t bit2 : 2;
    uint32_t bit3 : 3;
} MyBits;

union MyUnion {
    uint32_t all;
    MyBits bits;
};

int main() {
    union MyUnion myUnion;
    myUnion.all = 0;

    myUnion.bits.bit1 = 1;
    myUnion.bits.bit2 = 2;
    myUnion.bits.bit3 = 5;

    printf("all: %u\n", myUnion.all);
    printf("bit1: %u\n", myUnion.bits.bit1);
    printf("bit2: %u\n", myUnion.bits.bit2);
    printf("bit3: %u\n", myUnion.bits.bit3);

    return 0;
}

 

 

 

비트 필드(Bit Field)와 공용체(Union)

 

- 비트 필드는 비트 단위로 필요한 만큼의 공간을 할당하는 방식으로, 여러 개의 비트를 구조체 멤버로 사용하는 데이터 형식이다.

- 공용체는 여러 개의 멤버가 같은 메모리 위치를 공유하는 데이터 형식이다.

 

 

 

 

 

비트 필드멤버 정의

 

typedef struct {
    uint32_t bit1 : 1;
    uint32_t bit2 : 2;
    uint32_t bit3 : 3;
} MyBits;

 

위 예시에서 MyBits라는 구조체를 선언하고, 3개의 비트 필드 멤버 bit1, bit2, bit3를 정의 한 뒤 각 비트 필드 멤버에 할당된 비트 수를 콜론 : 뒤에 적어 비트 필드 멤버의 오프셋과 길이를 지정한다. bit1의 범위는 0~1, bit2의 범위는 0~3, bit3의 범위는 0~7이 된다.

 

비트 필드의 멤버는 기본적으로 메모리의 가장 낮은 비트부터(Least Significant Bit, LSB) 가장 높은 비트(또는 Most Significant Bit, MSB)까지 차례로 할당되므로 bit1이 [0:0], bit2가 [2:1], bit3이 [5:3]에 위치하게 된다.

 

 

 

공용체 선언

 

union MyUnion {
    uint32_t all;
    MyBits bits;
};

 

MyUnion이라는 공용체를 선언하고, uint32_t 형식의 all 멤버와 MyBits 구조체 형식의 bits 멤버를 동일한 메모리 위치에 공유하도록 설정한다.

여기서 all 멤버는 비트 필드 멤버들이 차지하는 비트들을 하나로 합쳐서 표현한 값이고, bit1, bit2, bit3 각 비트 필드 멤버들을 통해 값에 개별적으로 접근한다.

 

 

 

 

예시

typedef struct {
    unsigned int rsvd1: 4;
    unsigned int SEQ_CASC: 1;
    unsigned int SEQ_OVRD: 1;
    unsigned int CONT_RUN: 1;
    unsigned int CPS: 1;
    unsigned int ACQ_PS: 4;
    unsigned int SUSMOD: 2;
    unsigned int RESET: 1;
    unsigned int rsvd2: 1;
} ADCTRL1_BITS;

union ADCTRL1_REG {
    unsigned int all;
    ADCTRL1_BITS bit;
};

 

이렇게 비트 필드와 공용체를 사용하면 레지스터를 전체적으로 다루기 위한 변수와 레지스터의 각 비트 필드를 동시에 다룰 수 있다.