[C] 16. 비트 다루기

Taeil Nam·2022년 6월 23일
0

C

목록 보기
16/18
post-thumbnail

1. 비트 단위 논리 연산자(Bitwise Operator)

  • 1 bit만 사용하여 값을 표현하고 싶을 때 사용.
  • 1 bit를 사용하기 위해 최소 크기의 자료형인 char(1 byte)를 사용하면, 7 bit가 낭비됨.
  • 낭비를 줄이고 효율을 높이기 위해 사용됨.

종류

1. AND - & (Ampersand)

2. OR - | (Virtical bar)

3. NOT - ~ (Tilde)

4. XOR - ^ (Caret)


2. 비트 단위 시프트 연산자

  • 시프트(shift) = 옮기는 것.
  • 비트 시프트 = 비트를 옮기는 것.
  1. Leaf shift
    • "<<" 기호 사용.
    • 변수 << 이동시킬 횟수
    ex) var1 << 3	// var1 의 비트를 왼쪽으로 3번 이동.
  2. Right shift
    • ">>" 기호 사용.
    • 변수 >> 이동시킬 횟수
    ex) var1 >> 3	// var1 의 비트를 오른쪽으로 3번 이동.

3. 구조체 비트 필드

  • 구조체 멤버를 비트 단위로 선언 가능.
  • 구조체 멤버가 가지는 실제 크기는 1 bit 이지만, memory 패딩에 사용되는 크기의 기준은 주어진 자료형을 따름.

코드

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

void char_to_binary(const 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;     // 해당 멤버에 1 비트 할당 및 bool처럼 사용.
        bool has_shield : 1;    // ''
        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;
    items_flag.has_shield = 1;
    items_flag.has_potion = 0;
    items_flag.has_guntlet = 1;
    items_flag.has_hammer = 0;
    items_flag.has_key = 0;
    items_flag.has_ring = 0;
    items_flag.has_amulet = 0;

    printf("Size = %zd\n", sizeof(items_flag)); // 구조체의 크기 출력.

    print_binary((char*)&items_flag, sizeof(items_flag));   // 구조체의 2진수 출력.

    return 0;
}

결과


🚩 출처 및 참고자료 : 홍정모의 따라하며 배우는 C 언어 (따배씨)

0개의 댓글