56.4 연습문제: 구조체로 플래그 비트 필드 만들기

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

practice_struct_bit_field.c

#include <stdio.h>

struct Flags {
    ___________________
    ___________________
    ___________________
};

int main()
{
    struct Flags f1;

    f1.a = 0xffffffff;
    f1.b = 0xffffffff;
    f1.c = 0xffffffff;

    printf("%u %u %u\n", f1.a, f1.b, f1.c);

    return 0;
}

실행 결과

3 1 63

정답

unsigned int a : 2;
unsigned int b : 1;
unsigned int c : 6;

해설

f1.a, f1.b, f1.c에 모두 0xffffffff를 할당했는데 printf에서 출력하면 3, 1, 63이 나왔습니다. 따라서 이 구조체는 일정한 비트 수만 저장할 수 있는 비트 필드입니다.

0xffffffff는 1이 32개이므로 모든 비트가 1로 채워집니다. 따라서 각 값이 1이 몇 개인지 찾아내면 됩니다.

  • 3: 11이므로 1이 2개입니다.
  • 1: 1이므로 1이 1개입니다.
  • 63: 111111이므로 1이 6개입니다.

이렇게 찾은 비트 수대로 비트 필드를 만들면 됩니다.