56.5 연습문제: 구조체와 공용체로 플래그 비트 필드 만들기

다음 소스 코드를 완성하여 32936이 출력되게 만드세요.

practice_struct_union_bit_field.c

#include <stdio.h>

struct Flags {
    union {
        struct {
            _____________________
            _____________________                                  
            _____________________
            _____________________                                  
        };
        unsigned short e;
    };
};

int main()
{
    struct Flags f1 = { 0, };

    f1.a = 8;
    f1.b = 2;
    f1.c = 2;
    f1.d = 128;

    printf("%u\n", f1.e);

    return 0;
}

실행 결과

32936

정답

unsigned short a : 4;
unsigned short b : 2;
unsigned short c : 2;
unsigned short d : 8;

해설

Flags는 익명 공용체와 익명 구조체로 이루어져 있습니다. 그리고 익명 구조체 안의 각 멤버에 값을 할당한 뒤 unsigned short형 변수 e만 출력하고 있습니다. 따라서 익명 구조체의 멤버는 비트 필드로 만들어야 됩니다.

먼저 32936을 2진수로 표현해보면 1000 0000 1010 1000이 됩니다. 그리고 a, b, c, d에 할당한 값을 2진수로 표현해보면 다음과 같습니다.

  • 8: 1000
  • 2: 10
  • 2: 10
  • 128: 1000 0000

128 2 2 8의 2진수 값을 순서대로 붙여보면 1000 0000 10 10 1000이 되므로 32936과 같은 값입니다. 그러므로 비트 필드의 비트 수만 맞춰주면 되겠죠?

8은 4비트, 2는 2비트, 128은 8비트이므로 a는 4, b는 2, c는 2, d는 8로 비트 수를 지정해주면 됩니다.