시프트
왼쪽과 오른쪽 시프트를 알아봅니다
시프트은(는) 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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.