티스토리 뷰
비트연산자 <<
와 >>
총정리
비트연산자란?
정의
비트연산자는 정수를 이루는 비트(0과 1) 단위를 대상으로 하는 연산자입니다.
컴퓨터는 숫자를 2진수로 처리하기 때문에, 각 자리의 비트가 켜져(1
) 있거나 꺼져(0
) 있음을 통해 값을 표현합니다.
예를 들어, 정수 5
를 2진수로 쓰면 00000101
입니다.
여기서 왼쪽부터 오른쪽까지 각 자리에는 고유한 값이 있습니다.
비트연산은 각 자리의 비트가 1
인 경우에만 그 자리에 해당하는 값을 더합니다.
비트가 0
인 자리의 값은 더하지 않습니다.
비트 연산자 연산방법
비트값은 자리마다 아래와 같은 고유한 값을 가집니다.
비트값: 1 1 1 1 0 자리값: 16 8 4 2 1
여기서 비트값이 1
인 자리를 찾습니다.
위 예제에서는 왼쪽부터 16
, 8
, 4
, 2
가 모두 1
이므로 더합니다.
16 + 8 + 4 + 2 = 30
마지막 비트는 0
이므로 그 자리에 해당하는 1
은 더하지 않습니다.
핵심 규칙:
- 비트가
1
인 자리 → 해당 자리값을 더함 - 비트가
0
인 자리 → 해당 자리값은 무시
예시 1
비트값: 1 0 1 0 1 자리값: 16 8 4 2 1
16
(비트1) +4
(비트1) +1
(비트1) = 21- 여기서
8
과2
는 비트가0
이므로 더하지 않습니다.
예시 2
비트값: 0 1 0 1 0 자리값: 16 8 4 2 1
8
(비트1) +2
(비트1) = 1016
,4
,1
은 비트가0
이므로 더하지 않습니다.
왼쪽 시프트 연산자
왼쪽 시프트 연산자는 <<
로 표기하며, 비트를 왼쪽으로 밀어냅니다.
비트가 왼쪽으로 이동하면서 각 자리값도 2배가 됩니다.
오른쪽 끝에는 항상 0
이 채워집니다.
예시 1
원래 비트: 1 1 1 1 0 자리값: 16 8 4 2 1
왼쪽으로 한 칸 밀면:
왼쪽 이동: 1 1 1 0 0 자리값: 32 16 8 4 2
값: 32 + 16 + 8 + 4 = 60
기존 30
이 2배가 되어 60
이 됩니다.
예시 2
원래 비트: 1 0 1 0 1 자리값: 16 8 4 2 1
왼쪽으로 한 칸 밀면:
왼쪽 이동: 1 0 1 0 0 자리값: 32 16 8 4 2
값: 32 + 8 + 0 = 40
오른쪽 시프트 연산자
오른쪽 시프트 연산자는 >>
로 표기하며, 비트를 오른쪽으로 밀어냅니다.
비트가 오른쪽으로 이동하면서 각 자리값도 절반으로 줄어듭니다.
왼쪽 끝에는 0
이 채워집니다.
예시 1
원래 비트: 1 1 1 1 0 자리값: 16 8 4 2 1
오른쪽으로 한 칸 밀면:
오른쪽 이동: 0 1 1 1 1 자리값: 8 4 2 1 0
값: 8 + 4 + 2 + 1 = 15
기존 30
이 절반이 되어 15
가 됩니다.
예시 2
원래 비트: 1 0 1 0 1 자리값: 16 8 4 2 1
오른쪽으로 한 칸 밀면:
오른쪽 이동: 0 1 0 1 0 자리값: 8 4 2 1 0
값: 8 + 2 = 10
<< 2
, >> 2
코드 설명
비트를 두 칸씩 이동하는 코드입니다.
코드 예제 1
int x = 5;
int y = x << 2;
printf("%d", y); // 출력: 20
5
를 왼쪽으로 두 칸 밀면 5 × 4 = 20
비트값이 두 자리씩 밀려 각 자리값이 4배가 됩니다.
코드 예제 2
int x = 20;
int y = x >> 2;
printf("%d", y); // 출력: 5
20
을 오른쪽으로 두 칸 밀면 20 ÷ 4 = 5
비트값이 두 자리씩 밀려 각 자리값이 4분의 1이 됩니다.
결론
- 비트연산자는 각 자리의
1
비트에 해당하는 값만 계산된다. - 왼쪽 시프트는 값을 2배, 4배 등으로 빠르게 만든다.
- 오른쪽 시프트는 값을 절반, 4분의 1로 빠르게 줄인다.
- 비트 자리별 값을 이해해야 계산 과정을 명확히 알 수 있다.
요약표
연산자 | 동작 | 계산식 |
---|---|---|
x << 1 |
왼쪽으로 1칸 이동 | x × 2 |
x << n |
왼쪽으로 n칸 이동 | x × 2ⁿ |
x >> 1 |
오른쪽으로 1칸 이동 | x ÷ 2 |
x >> n |
오른쪽으로 n칸 이동 | x ÷ 2ⁿ |
'C언어' 카테고리의 다른 글
C언어에서 문자열 포인터와 서식문자(%c, %s) (0) | 2025.07.15 |
---|---|
C언어 구조체 포인터의 점(.)과 화살표(->) 차이 설명 (0) | 2025.07.15 |
C언어 printf 소수점 출력 완전 정리 (0) | 2025.07.13 |
C언어 2차원 배열과 포인터 정리 (0) | 2025.07.07 |
포인터 증감 연산 완전정복 (0) | 2025.07.07 |
- Total
- Today
- Yesterday
- 동적계획법
- 동적 계획법
- 그리디알고리즘
- 코딩테스트
- 문자열처리
- C++ 알고리즘
- 코딩
- 알고리즘
- 알고리즘문제풀이
- DP
- 파이썬코딩
- 백준
- python 알고리즘
- 프로그래밍
- 브루트포스
- 문제 풀이
- c++알고리즘
- c언어
- 문제풀이
- 코딩 테스트
- 그래프 탐색
- 파이썬
- 알고리즘 문제풀이
- 객체지향
- dfs
- Python
- 파이썬문제풀이
- 그리디
- C++
- 알고리즘기초
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |