몽상실현개발주의

[따배씨] 15.7 비트단위 연산자의 다양한 사용법 본문

Language/C

[따배씨] 15.7 비트단위 연산자의 다양한 사용법

migrationArc 2021. 7. 25. 18:48

[따배씨] 15.7 비트단위 연산자의 다양한 사용법

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

15강 비트 다루기

15.7 비트단위 연산자의 다양한 사용법

  • 비트단위 연산자는 메모리와 CPU 를 잘 사용해야 하는 큰 프로그램을 작성할때 유용하게 사용 가능
#include <stdio.h>
#include <math.h>

//                      shift     Decimal   Binary      Hex     Octet
#define MASK_SWORD      (1<<0) // 2^0       00000001    0X01    01
#define MASK_SHIELD     (1<<1) // 2^1       00000010    0X02    02
#define MASK_POTION     (1<<2) // 2^2       00000100    0X04    04
#define MASK_GUNTLET    (1<<3) // 2^3       00001000    0X08    010
#define MASK_HAMMER     (1<<4) // 2^4       00010000    0X10    020
#define MASK_KEY        (1<<5) // 2^5       00100000    0X20    040
#define MASK_RING       (1<<6) // 2^6       01000000    0X40    0100
#define MASK_AMULET     (1<<7) // 2^7       10000000    0X80    0200

void char_binary(const char num);
void int_binary(const int num);

/*
    flag            01011010
    mask            00000011
    mask & flag =   00000010
 */

int main()
{
    /*
        bool has_sword = false;
        bool has_shield = false;
        bool has_potion = false;
        bool has_guntlet = false;
        bool has_hammel = false;
        bool has_key = false;
        bool has_ring = false;
        bool has_amulet = false;
     */
    
    char flags = 0; // MASK flags
    char_binary(flags);
    // Decimal   0     == Bianry 00000000
    
    printf("\nTurning Bits On (Setting Bits)\n");
    flags = flags | MASK_SWORD; // flag != MASK_SWORD;
    char_binary(flags);
    // Decimal   1     == Bianry 00000001
    flags |= MASK_AMULET;
    char_binary(flags);
    // Decimal -127     == Bianry 10000001
    
    printf("\nTurning Biys Off (Clearning Bits)\n");
    flags = flags | MASK_POTION;
    char_binary(flags);
    // Decimal -123     == Bianry 10000101
    flags = flags & ~MASK_POTION;   // flags &= ~MASK_POTION;
    char_binary(flags);
    // Decimal -127     == Bianry 10000001
    
    
    printf("\nToggling Bits\n");
    flags = flags ^ MASK_HAMMER;
    char_binary(flags);
    // Decimal -111     == Bianry 10010001
    flags = flags ^ MASK_HAMMER;
    char_binary(flags);
    // Decimal -127     == Bianry 10000001
    flags = flags ^ MASK_HAMMER;
    char_binary(flags);
    // Decimal -111     == Bianry 10010001
    
    printf("\nChecking the Value of a Bit\n");
    if ((flags & MASK_KEY) == MASK_KEY)
        printf(">> You can enter.\n");
    else
        printf(">> You can not enter.\n");
    // >> You can not enter.
    
    flags |= MASK_KEY;
    
    if ((flags & MASK_KEY) == MASK_KEY)
        printf(">> You can enter.\n");
    else
        printf(">> You can not enter.\n");
    // >> You can enter.
    
    printf("\nTrimming\n");
    int int_flag = 0xffffffff;
    // 11111111111111111111111111111111
    int_binary(int_flag);
    // Decimal  -1     == Bianry 11111111111111111111111111111111
    int_flag &= 0xff;
    // Trim by 11111111
    int_binary(int_flag);
    // Decimal 255     == Bianry 00000000000000000000000011111111
    
    return 0;
}

void int_binary(const int num)
{
    printf("Decimal %3d \t== Bianry ", num);
    
    const size_t bits = sizeof(num) * 8;
    
    for (size_t i = 0; i < bits; i++)
    {
        const int mask = 1 << (bits - 1 - i);
        // bit 연산자를 이용하여 mask 를 만듬, 더 효율적
        
        if ((num & mask) == mask)
            printf("%d", 1);
        else
            printf("%d", 0);
    }
    printf("\n");
}

void char_binary(const char num)
{
    printf("Decimal %3d \t== Bianry ", num);
    
    const size_t bits = sizeof(num) * 8;
    
    for (size_t i = 0; i < bits; i++)
    {
        const int mask = 1 << (bits - 1 - i);
        // bit 연산자를 이용하여 mask 를 만듬, 더 효율적
        
        if ((num & mask) == mask)
            printf("%d", 1);
        else
            printf("%d", 0);
    }
    printf("\n");
}
flag = 01011010;
mask = 00000011;
// mask & flag =   00000010;
  • mask 는 보고싶은 (확인 하고 싶은 부분) 만 보기위한 선언
    • flag 는 현재 상태, mask 는 확인하고 싶은 데이터
    • & 비트 연산을 통해 확인하고 싶은 부분의 데이터 확인 가능

 

 


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

http://blog.naver.com/atelierjpro

 

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

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

blog.naver.com

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

 

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

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

www.inflearn.com

 

Comments