몽상실현개발주의

[따배씨] 15.10 비트필드의 사용방법 본문

Language/C

[따배씨] 15.10 비트필드의 사용방법

migrationArc 2021. 7. 27. 18:12

[따배씨] 15.10 비트필드의 사용방법

따배씨 - 따라하며 배우는 C언어

15강 비트 다루기

15.9 15.10 비트필드의 사용방법

 

#include <stdio.h>
#include <limits.h>
#include <stdbool.h>

void char_to_binary(unsigned char uc)
{
    const int bits = CHAR_BIT * sizeof(unsigned char);
    
    for (int i = bits - 1; i >= 0; i--)
    {
        printf("%d", (uc >> i & 1));
    }
}

void print_binary(char* data, int bytes)
{
    for (int i = 0; i < bytes; i++)
    {
        char_to_binary(data[i]);
    }
    printf("\n");
}

int main()
{
    struct items {
        bool has_sword      : 1;    // : number means bits to use!
        bool has_shield     : 1;    // 1bit 크기의 bool type
        bool has_potion     : 1;
        bool has_guntlet    : 1;
        bool has_hammer     : 1;
        bool has_key        : 1;
        bool has_ring       : 1;
        bool has_amulet     : 1;
    } items_flag;
    
    items_flag.has_sword    = 1;    // flags = flags | MASK_SWORD;
    items_flag.has_shield   = 1;
    items_flag.has_potion   = 0;
    items_flag.has_guntlet  = 1;
    items_flag.has_hammer   = 0;
    items_flag.has_key      = 1;
    items_flag.has_ring     = 1;
    items_flag.has_amulet   = 1;
    
    printf("Size = %zd\n", sizeof(items_flag));
    // Size = 1
    
    print_binary((char *)&items_flag, sizeof(items_flag));
    // 11001011
    
    if (items_flag.has_key == 1)
        printf(">> You can enter.\n");
        // >> You can enter.
    
    
    
    union{
        struct items bf;
        unsigned char uc;
    } uni_flag;
    
    uni_flag.uc = 0;
    uni_flag.bf.has_amulet = true;
    uni_flag.uc |= (1 << 5);
    print_binary((char*)&uni_flag, sizeof(uni_flag));
    // 10100000
    
    uni_flag.bf.has_key = false;
    print_binary((char*)&uni_flag, sizeof(uni_flag));
    // 10000000
    
    return  0;
}
union{
  struct items bf;
  unsigned char uc;
} uni_flag;

uni_flag.uc = 0;
  • structure 를 이용하여 bit-fields 로 사용
    • union 을 이용하여 초기화를 쉽게 함

 

 

#include <stdio.h>
#include <limits.h>
#include <stdbool.h>

int main()
{
    struct file_time {
        unsigned int seconds    : 5;   // 2^5 = 32, 0 ~ 30*2 seconds
        unsigned int minutes    : 6;   // 2^6 = 64, 0 ~ 60 minutes
        unsigned int hours      : 5;   // 2^5 = 32, 0 ~ 23 hours
    };
    
    struct file_date {
        unsigned int day        : 5;   // 2^5 = 32, 1 ~ 31 day
        unsigned int month      : 4;   // 2^4 = 16, 1 ~ 12 month
        unsigned int year       : 7;   // 2^7 = 128, 1980 ~ years
    } fd;
    
    /* 1988 12 28 */
    fd.day = 28;
    fd.month = 12;
    fd.year = 8;
    
    printf("Day %u, Month %u Year %u,\n", fd.day, fd.month, fd.year);
    
    // scanf("%d", &fd.day);    /* Warning */
    return  0;
}
struct file_time {
        unsigned int seconds    : 5;   // 2^5 = 32, 0 ~ 30*2 seconds
        unsigned int minutes    : 6;   // 2^6 = 64, 0 ~ 60 minutes
        unsigned int hours      : 5;   // 2^5 = 32, 0 ~ 23 hours
    };
    
struct file_date {
        unsigned int day        : 5;   // 2^5 = 32, 1 ~ 31 day
        unsigned int month      : 4;   // 2^4 = 16, 1 ~ 12 month
        unsigned int year       : 7;   // 2^7 = 128, 1980 ~ years
    };
  • 파일이 생성 될때, 시간 / 날짜를 Bits-Fields 를 이용하여 최적화 표기 가능

 

// scanf("%d", &fd.day);    /* WRONG */
  • Bits-Fields 는 bit 단위로 메모리를 사용하기 때문에, 주소의 최소 단위인 1Byte 의 연산이 불가능 함
    • scanf 는 입력 값이 저장될 공간 위치를 주소값으로 지정

 

 

 


이 글의 모든 사진과 내용의 출처는 홍정모 교수님께 있음을 알려드립니다.

http://blog.naver.com/atelierjpro

 

실리콘 밸리의 프로그래머 : 네이버 블로그

안녕하세요! 홍정모 블로그에 오신 것을 환영합니다. 주로 프로그래밍 관련 메모 용도로 사용합니다. 강의 수강하시는 분들은 홍정모 연구소 카페로 오세요.

blog.naver.com

http://www.inflearn.com/course/following-c

 

홍정모의 따라하며 배우는 C언어 - 인프런 | 강의

'따배씨++'의 성원에 힘입어 새롭게 개발된 C 언어로 시작하는 프로그래밍 입문 강의입니다. '따배씨'와 함께 프로그래밍 인생을 업그레이드 해보세요., 따라하며 배우는 C언어 '따배씨++'의 성원

www.inflearn.com

 

 

Comments