비트연산

비트 연산 연습 3: 핵심 패턴 4가지

/*
 * 비트 연산 연습 3: 핵심 패턴 4가지
 *
 * 학습 목표 (암기!):
 * 1. 켜기:   value |= (1 << n)
 * 2. 끄기:   value &= ~(1 << n)
 * 3. 토글:   value ^= (1 << n)
 * 4. 확인:   if (value & (1 << n))
 */

#include <stdio.h>

 // 8비트 2진수로 출력하는 함수
void printBinary(unsigned char num)
{
    printf("[");
    for (int i = 7; i >= 0; i--)
    {
        if (num & (1 << i))
            printf("1");
        else
            printf("0");
    }
    printf("]");
}

// 비트 상태를 보기 쉽게 출력
void printBitStatus(unsigned char value)
{
    printf("비트:  7  6  5  4  3  2  1  0\n");
    printf("값:   ");
    for (int i = 7; i >= 0; i--)
    {
        if (value & (1 << i))
            printf(" 1 ");
        else
            printf(" 0 ");
    }
    printf("\n");
}

int main(void)
{
    unsigned char value = 0b00000000;  // 시작: 모든 비트 0
    int bitNum;

    printf("=====================================\n");
    printf("   비트 조작 핵심 패턴 4가지\n");
    printf("=====================================\n\n");

    // 초기 상태
    printf("초기값: ");
    printBinary(value);
    printf(" = %d\n\n", value);
    printBitStatus(value);
    printf("\n");

    // 1. 비트 켜기 (SET)
    printf("===== 1. 비트 켜기 (SET) =====\n");
    printf("패턴: value |= (1 << n)\n\n");

    value = 0;
    printf("3번 비트 켜기: value |= (1 << 3)\n");
    value |= (1 << 3);
    printf("결과: ");
    printBinary(value);
    printf(" = %d\n", value);
    printBitStatus(value);
    printf("\n");

    printf("5번 비트도 켜기: value |= (1 << 5)\n");
    value |= (1 << 5);
    printf("결과: ");
    printBinary(value);
    printf(" = %d\n", value);
    printBitStatus(value);
    printf("\n");

    // 2. 비트 끄기 (CLEAR)
    printf("===== 2. 비트 끄기 (CLEAR) =====\n");
    printf("패턴: value &= ~(1 << n)\n\n");

    printf("3번 비트 끄기: value &= ~(1 << 3)\n");
    value &= ~(1 << 3);
    printf("결과: ");
    printBinary(value);
    printf(" = %d\n", value);
    printBitStatus(value);
    printf("\n");

    // 3. 비트 토글 (TOGGLE)
    printf("===== 3. 비트 토글 (TOGGLE) =====\n");
    printf("패턴: value ^= (1 << n)\n");
    printf("(0이면 1로, 1이면 0으로)\n\n");

    printf("현재: ");
    printBinary(value);
    printf("\n");

    printf("5번 비트 토글: value ^= (1 << 5)\n");
    value ^= (1 << 5);
    printf("결과: ");
    printBinary(value);
    printf(" (5번이 꺼짐)\n\n", value);

    printf("5번 비트 다시 토글\n");
    value ^= (1 << 5);
    printf("결과: ");
    printBinary(value);
    printf(" (5번이 다시 켜짐)\n\n", value);

    // 4. 비트 확인 (CHECK)
    printf("===== 4. 비트 확인 (CHECK) =====\n");
    printf("패턴: if (value & (1 << n))\n\n");

    value = 0b00101000;  // 3번, 5번 비트가 1
    printf("value = ");
    printBinary(value);
    printf("\n\n");

    for (int i = 0; i <= 7; i++)
    {
        printf("%d번 비트: ", i);
        if (value & (1 << i))
            printf("1 (켜짐)\n");
        else
            printf("0 (꺼짐)\n");
    }

    printf("\n=====================================\n");
    printf("암기하세요!\n");
    printf("=====================================\n");
    printf("켜기:   value |= (1 << n)\n");
    printf("끄기:   value &= ~(1 << n)\n");
    printf("토글:   value ^= (1 << n)\n");
    printf("확인:   if (value & (1 << n))\n");
    printf("=====================================\n");

    return 0;
}

 

댓글

댓글 본문
graphittie 자세히 보기