쉬프트 연산이란?
쉬프트 연산은 이진수의 비트를 좌우로 이동시키는 연산이다. 쉽게 말해서 숫자의 비트를 좌측이나 우측으로 밀어서 새로운 값을 만드는 연산이다.
- 왼쪽 쉬프트(<<)
- 비트를 왼쪽으로 민다.
- 왼쪽 쉬프트는 곱셈처럼 동작한다. a << b는 a * (2^b)와 같은 결과가 나온다.
- 오른쪽 쉬프트(>>)
- 비트를 오른쪽으로 민다.
- 오른쪽 쉬프트는 나눗셈처럼 동작한다. a >> b는 a / (2^b)와 같은 결과가 나온다.
쉬프트 연산의 활용 예시
- 비트 마스크 생성: 특정 비트를 1로 설정하거나 0으로 클리어할 때 쉬프트 연산을 많이 사용한다. 예를 들어, 1 << 3은 00001000이 돼서 네 번째 비트를 1로 만드는 데 사용할 수 있다.
- 빠른 계산: 곱셈과 나눗셈 대신 사용할 수 있어서 속도 최적화에 도움이 된다. x * 4 대신 x << 2를 사용할 수 있다.
비트 연산이란?
비트 연산은 숫자의 각 비트에 대해 논리 연산을 수행하는 것이다. C 언어에는 여러 가지 비트 연산자가 있다:
- AND 연산자(&)
- 둘 다 1일 때만 1이 된다.
- 예를 들어, 5 & 3은 00000101 & 00000011이니까 결과는 00000001이 된다. 즉, 1이다.
- OR 연산자(|)
- 둘 중 하나라도 1이면 1이 된다.
- 예를 들어, 5 | 3은 00000101 | 00000011이니까 결과는 00000111이 된다. 즉, 7이다.
- XOR 연산자(^)
- 둘이 다르면 1이 된다.
- 예를 들어, 5 ^ 3은 00000101 ^ 00000011이니까 결과는 00000110이 된다. 즉, 6이다.
- NOT 연산자(~)
- 각 비트를 반전시킨다. 즉, 1은 0으로, 0은 1로 바뀐다.
- 예를 들어, ~5는 00000101을 반전시켜서 11111010이 된다. 부호 비트 때문에 음수가 된다.
비트 연산 활용 예제 코드
다음은 여러 비트 연산을 한 코드로 보여주는 예제이다.
#include <stdio.h>
int main() {
unsigned char a = 5;
unsigned char b = 3;
unsigned char result;
result = a & b;
printf("AND 연산 결과: %d\n", result); // 결과: 1
result = a | b;
printf("OR 연산 결과: %d\n", result); // 결과: 7
result = a ^ b;
printf("XOR 연산 결과: %d\n", result); // 결과: 6
result = ~a;
printf("NOT 연산 결과: %d\n", result); // 결과: 250
result = a << 1;
printf("왼쪽 쉬프트 결과: %d\n", result); // 결과: 10
result = a >> 1;
printf("오른쪽 쉬프트 결과: %d\n", result); // 결과: 2
return 0;
}
예제 설명
- AND 연산: a & b는 두 비트 모두 1일 때만 1이 된다.
- OR 연산: a | b는 하나라도 1이면 1이 된다.
- XOR 연산: a ^ b는 둘이 다를 때만 1이 된다.
- NOT 연산: ~a는 모든 비트를 반전시킨다.
- 왼쪽 쉬프트: a << 1은 비트를 왼쪽으로 한 칸 이동시킨다.
- 오른쪽 쉬프트: a >> 1은 비트를 오른쪽으로 한 칸 이동시킨다.
728x90
'C언어' 카테고리의 다른 글
[C언어] volatile 키워드란? (0) | 2024.10.11 |
---|---|
[C언어] 구조체, 열거형, 공용체란? (0) | 2024.10.10 |
[C언어] (void *) 포인터란? (0) | 2024.10.10 |
[C언어] memcpy() 함수 (0) | 2024.10.10 |
[C언어] memset() 함수 (0) | 2024.10.10 |