0Pricing
C Academy · 강의

시프트

왼쪽과 오른쪽 시프트를 알아봅니다

시프트은(는) CoddyKit의 무료 C Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

비트 이동하기

이동 연산자는 정수의 모든 비트를 지정한 위치 수만큼 왼쪽이나 오른쪽으로 이동합니다.

왼쪽 이동은 <<이고 오른쪽 이동은 >>입니다.

#include <stdio.h>

int main(void) {
    unsigned x = 1;
    printf("1 << 3 = %u\n", x << 3);
    return 0;
}

왼쪽 이동으로 곱하기

n자리만큼 왼쪽으로 이동하면 부호 없는 값에 2의 n제곱을 곱한 결과가 됩니다.

1 << 3은 8이고, 5 << 1은 10입니다.

#include <stdio.h>

int main(void) {
    printf("5 << 1 = %u\n", 5u << 1);
    printf("3 << 4 = %u\n", 3u << 4);
    return 0;
}

오른쪽 이동으로 나누기

n자리만큼 오른쪽으로 이동하면 부호 없는 값을 2의 n제곱으로 나눈 결과가 됩니다. 오른쪽 끝에서 밀려나는 비트는 버려집니다.

20 >> 2는 5입니다.

#include <stdio.h>

int main(void) {
    printf("20 >> 2 = %u\n", 20u >> 2);
    printf("7 >> 1 = %u\n", 7u >> 1);
    return 0;
}

2의 거듭제곱

1을 왼쪽으로 이동하는 것은 2의 거듭제곱을 만드는 가장 빠른 방법입니다.

1 << n은 2의 n제곱입니다.

#include <stdio.h>

int main(void) {
    for (int n = 0; n < 6; n++) {
        printf("2^%d = %u\n", n, 1u << n);
    }
    return 0;
}

비트 이동 시각화하기

이동 전후의 비트를 출력하면 비트 패턴이 어떻게 미끄러져 이동하는지 확인할 수 있습니다.

#include <stdio.h>

void print_bits(unsigned char v) {
    for (int i = 7; i >= 0; i--) putchar((v >> i) & 1 ? '1' : '0');
    putchar('\n');
}

int main(void) {
    unsigned char v = 0b00000110;
    print_bits(v);
    print_bits(v << 2);
    return 0;
}

비트 추출하기

i번 비트를 읽으려면 값을 i만큼 오른쪽으로 이동한 다음 1로 마스크하십시오.

결과는 0 또는 1입니다.

#include <stdio.h>

int main(void) {
    unsigned v = 0b10110;
    for (int i = 0; i < 5; i++) {
        printf("bit %d = %u\n", i, (v >> i) & 1);
    }
    return 0;
}

비트 단위로 값 만들기

비트를 제자리로 이동하고 OR로 결합하여 숫자를 조립할 수 있습니다.

#include <stdio.h>

int main(void) {
    unsigned v = 0;
    v |= (1u << 0);
    v |= (1u << 2);
    v |= (1u << 4);
    printf("v = %u\n", v);
    return 0;
}

부호 있는 값의 오른쪽 이동 주의사항

음의 부호 있는 정수를 오른쪽으로 이동한 결과는 구현에 따라 달라질 수 있습니다. 부호 비트를 복사할 수도 있습니다.

예측 가능한 비트 연산을 위해서는 unsigned 형식을 우선 사용하십시오.

#include <stdio.h>

int main(void) {
    int s = -8;
    printf("-8 >> 1 = %d (implementation-defined)\n", s >> 1);
    unsigned u = 8;
    printf("8u >> 1 = %u\n", u >> 1);
    return 0;
}

과도한 시프트 피하기

형식의 비트 너비 이상만큼 시프트하면 정의되지 않은 동작이 됩니다.

32비트 값을 32비트 이상 시프트하는 것은 허용되지 않습니다.

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

int main(void) {
    printf("unsigned has %zu bits\n", sizeof(unsigned) * CHAR_BIT);
    printf("Safe shift 1u << 31 = %u\n", 1u << 31);
    return 0;
}

시프트와 마스크 결합하기

시프트와 마스크를 함께 사용하면 여러 비트로 이루어진 필드를 추출할 수 있습니다. 여기서는 바이트에서 가운데 4비트를 가져옵니다.

#include <stdio.h>

int main(void) {
    unsigned v = 0b11010110;
    unsigned field = (v >> 2) & 0b1111;
    printf("field = %u\n", field);
    return 0;
}

빠른 곱셈과 덧셈

시프트를 결합하면 상수를 빠르게 곱할 수 있습니다. 10을 곱하는 것은 3만큼 시프트하는 것(8을 곱함)에 1만큼 시프트하는 것(2를 곱함)을 더하는 것과 같습니다.

#include <stdio.h>

int main(void) {
    unsigned x = 7;
    unsigned times10 = (x << 3) + (x << 1);
    printf("7 * 10 = %u\n", times10);
    return 0;
}

빠른 확인

시프트에 대한 지식을 확인해 보십시오.

복습

시프트 연산자에 대해 배웠습니다.

  • <<는 왼쪽으로 시프트하여 2의 거듭제곱을 곱합니다.
  • >>는 오른쪽으로 시프트하여 2의 거듭제곱으로 나눕니다.
  • (v >> i) & 1은 단일 비트를 추출합니다.
  • 예측 가능한 시프트를 사용하려면 unsigned를 사용하고, 형식의 비트 너비 이상으로 시프트하지 마십시오.

자주 묻는 질문

“시프트” 강의는 무료인가요?

네 — “시프트” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C Academy 강의 전체를 잠금 해제할 수 있습니다. C Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“시프트”에서 뭘 배우나요?

왼쪽과 오른쪽 시프트를 알아봅니다 브라우저에서 직접 실행하는 실습 코드로 C Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

C Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 C Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.

“시프트” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 C Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 C Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 비트 연산자
  2. 시프트
  3. 비트 마스크와 플래그
  4. 실전 비트 기법
← C Academy(으)로 돌아가기