반응형
C언어는 시스템 프로그래밍 언어로서 하드웨어와 가까운 작업을 수행할 수 있습니다. 특히 비트 단위로 데이터를 다룰 수 있는 비트연산은 효율적이고 강력한 기능으로, 알고리즘 최적화, 하드웨어 제어, 데이터 압축 등 다양한 분야에서 사용됩니다. 특히 코딩테스트에서 비트연산을 활용하면 코드를 깔끔하고 짧게 작성할 수 있습니다. 또한 동작 시간도 매우 많이 줄일 수 있습니다. 이번 포스팅에서는 비트연산의 개념, 문법, 원리, 사용 방법과 예제를 살펴보겠습니다.
1. 비트연산이란?
비트연산은 2진수 비트(bit)를 기준으로 수행되는 연산입니다. 데이터는 메모리에 0과 1로 저장되며, 비트연산은 이를 직접 조작할 수 있도록 도와줍니다. 이는 연산 속도가 빠르고 메모리를 효율적으로 사용할 수 있는 장점이 있습니다.
반응형
2. C언어 비트연산자 종류
C언어에서 제공하는 주요 비트연산자는 다음과 같습니다:
연산자 | 설명 | 예시 |
& | 비트 AND | a & b |
| | 비트 OR | a | b |
^ | 비트 XOR | a ^ b |
~ | 비트 NOT (1→0, 0→1) | ~a |
<< | 비트 왼쪽으로 시프트 | a << n |
>> | 비트 오른쪽으로 시프트 | a >> n |
3. 비트연산의 원리
(1) 비트 AND (&)
- 두 비트가 모두 1일 때 결과는 1, 그렇지 않으면 0.
int a = 5; // 0101
int b = 3; // 0011
int result = a & b; // 0001 (1)
(2) 비트 OR (|)
- 두 비트 중 하나라도 1이면 결과는 1
int a = 5; // 0101
int b = 3; // 0011
int result = a | b; // 0111 (7)
(3) 비트 XOR (^)
- 두 비트가 다르면 1, 같으면 0
int a = 5; // 0101
int b = 3; // 0011
int result = a ^ b; // 0110 (6)
(4) 비트 NOT (~)
- 비트를 반전시킴 (1→0, 0→1)
int a = 5; // 0101
int result = ~a; // 1010 (컴파일러에 따라 결과 다름)
(5) 비트 시프트
1) 왼쪽 시프트 (<<)
- 비트를 왼쪽으로 이동하며, 맨 오른쪽은 0으로 채움.
int a = 5; // 0101
int result = a << 1; // 1010 (10)
2) 오른쪽 시프트 (>>)
- 비트를 오른쪽으로 이동하며, 가장 왼쪽은 0 또는 부호 비트로 채움. 가장 오른쪽을 벗어나는 비트들은 버림.
int a = 5; // 0101
int result = a >> 1; // 0010 (2)
4. C언어에서 유용한 비트연산 사용 예시
1. 상수를 사용한 비트 마스크
- 특정 비트가 켜져있는지 확인할 때 사용합니다.
int flags = 0b00001111;
int mask = 0b00000100;
// 특정 비트 확인
if (flags & mask) {
printf("비트가 켜져 있습니다.\n");
}
2. 비트 플래그 설정 및 초기화
- 특정 비트를 켜거나 끌 때 유용합니다.
int flags = 0; // 모든 비트 0
// 비트 켜기
flags |= 0b00000001;
// 비트 끄기
flags &= ~0b00000001;
3. 시프트 연산으로 빠른 곱셈 및 나눗셈
- 왼쪽으로 비트 1칸 시프트하는 연산은 2를 곱하는 연산과 같음.
- 우측으로 비트 1칸 시프트하는 연산은 2를 나누는 연산과 같음
- 곱하기, 나누기 연산자를 사용하는 것보다 속도가 월등히 빠름!!
int a = 5;
int result1 = a << 1; // 5 * 2 = 10
int result2 = a >> 1; // 5 / 2 = 2
4. 짝수/홀수 판별
비트 AND 연산을 사용하여 숫자가 짝수인지 홀수인지 확인할 수 있습니다.
#include <stdio.h>
int main() {
int number = 10;
if (number & 1) {
printf("홀수입니다.\n");
} else {
printf("짝수입니다.\n");
}
return 0;
}
5. 특정 비트 토글
특정 위치의 비트를 반전시킵니다.
#include <stdio.h>
int main() {
int value = 0b0101;
int mask = 0b0010;
value ^= mask; //0b0111
printf("결과: %d\n", value);
return 0;
}
6. 두 숫자의 비트 차이 계산
두 숫자의 비트를 비교하여 다른 비트의 개수를 세어봅니다.
#include <stdio.h>
int countDifferentBits(int a, int b) {
int count = 0;
int diff = a ^ b;
while (diff) {
count += diff & 1;
diff >>= 1;
}
return count;
}
int main() {
int a = 29;
int b = 15;
printf("다른 비트 개수: %d\n", countDifferentBits(a, b));
return 0;
}
C언어의 비트연산은 강력하면서도 빠른 데이터 조작 도구입니다. 비트 단위로 데이터에 접근하여 효율성을 높이고, 메모리와 연산 속도를 최적화할 수 있습니다.
함께 보면 좋은 글
비트 연산을 코딩테스트에 적용하면 실행시간을 획기적으로 단축시킬 수 있습니다. 아래 포스팅에서 관련 내용 함께 보시면 더욱 좋습니다.
2024.12.22 - [C 언어] - 비트연산 - 코딩테스트 시간단축을 위한 마법
반응형
'C 언어' 카테고리의 다른 글
C언어 매크로(Macro)의 모든 것 - #define, 개념, 동작원리, 성능, 장점, 다양한 예시, 주의사항 (0) | 2024.12.22 |
---|---|
비트연산 - 코딩테스트 시간단축을 위한 마법 (1) | 2024.12.22 |
C언어 char 타입과 ASCII 코드 완벽 이해 - 전체 아스키 코드 표, 대소문자 변환 (2) | 2024.12.21 |
C 언어의 모든 데이터 타입: 범위, 메모리 크기, 개념 완벽 정리 (0) | 2024.12.21 |
타입 캐스팅을 활용해서 성능 개선하기 (0) | 2023.08.13 |
댓글