Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
05-15 02:05
관리 메뉴

nomad-programmer

[Programming/C] 비트 단위 분리 본문

Programming/C

[Programming/C] 비트 단위 분리

scii 2020. 6. 16. 20:32

구조체 문법으로 비트 단위를 분리할 수 있다.

#pragma warning(disable: 4996)

#include <stdio.h>

// 비트 단위 정보를 다룰 수 있도록 구조체를 선언 (총 1바이트)
// 구조체 멤버 하나하나가 1비트
struct BitType {
    unsigned char bit_0 : 1;
    unsigned char bit_1 : 1;
    unsigned char bit_2 : 1;
    unsigned char bit_3 : 1;
    unsigned char bit_4 : 1;
    unsigned char bit_5 : 1;
    unsigned char bit_6 : 1;
    unsigned char bit_7 : 1;    // 최상위 비트 (MSB)
};


int main(void) {
    struct BitType data;
    
    // 리틀 엔디안 기준
    // data -> 0x05, 0000 00101 비트 구조가 된다.
    data.bit_0 = 1;
    data.bit_1 = 0;
    data.bit_2 = 1;
    data.bit_3 = 0;
    data.bit_4 = 0;
    data.bit_5 = 0;
    data.bit_6 = 0;
    data.bit_7 = 0;

    printf("%d\n", data);

    /*
    // 오류 발생: data는 BitType 구조체로 만든 변수
    unsigned char tmp;
    tmp = data;

    // 오류 발생: 데이터 형식이 달라서 형 변환에 실패
    tmp = (unsigned char)data;

    // 성공: data 변수의 시작 주소에서 tmp변수의 시작 주소로 1바이트 크기만큼 메모리 복사
    // 허나 고작 1바이트를 복사하겠다고 memcpy함수를 사용하는 것은 적절히 않아 보임
    memcpy(&tmp, &data, 1);
    */

    return 0;
}

구조체 비트 분리 기능을 사용한 변수는 다른 일반 변수와 값을 주고 받기 어렵다.

허나 공용체를 사용하면 가능하다.

 

공용체를 사용하여 좀 더 편한 비트 단위 분리하기의 예제

#pragma warning(disable: 4996)

#include <stdio.h>

// 비트 단위 정보를 다룰 수 있도록 구조체를 선언 (총 1바이트)
// 구조체 멤버 하나하나가 1비트
struct BitType {
    unsigned char bit_0 : 1;
    unsigned char bit_1 : 1;
    unsigned char bit_2 : 1;
    unsigned char bit_3 : 1;
    unsigned char bit_4 : 1;
    unsigned char bit_5 : 1;
    unsigned char bit_6 : 1;
    unsigned char bit_7 : 1;    // 최상위 비트 (MSB)
};

// 1바이트의 자료형
union BitData {
    struct BitType bit_data;
    unsigned char byte_data;
};


int main(void) {
    union BitData tmp;
    tmp.byte_data = 0x63;

    printf("byte_data: %x\n", tmp.byte_data);
    printf("bit_data: %d%d%d%d %d%d%d%d\n",
        tmp.bit_data.bit_7, tmp.bit_data.bit_6, tmp.bit_data.bit_5, tmp.bit_data.bit_4,
        tmp.bit_data.bit_3, tmp.bit_data.bit_2, tmp.bit_data.bit_1, tmp.bit_data.bit_0);

    return 0;
}

// 결과
/*

byte_data: 63
bit_data: 0110 0011

*/

공용체 문법을 사용하면 메모리를 강제로 복사하지 않고 문제를 해결할 수 있다.

공용체는 메모리를 공유한다. 따라서 위와 같이 tmp.byte_data 요소에 0x63 값을 대입하면, 메모리를 공유하는 tmp 변수의 bit_data 요소에도 비트 단위로 값을 대입한 것과 같다.

사용법은 조금 더 쉬워지지만 연산 능력은 비트 연산자가 더 좋다.
Comments