본문 바로가기
C 언어

C언어 비트연산 완벽 정리 - 장점, 원리, 사용 예시, 예제코드

by Best Coding 2024. 12. 22.
반응형

  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 언어] - 비트연산 - 코딩테스트 시간단축을 위한 마법

 

비트연산 - 코딩테스트 시간단축을 위한 마법

코딩테스트에서 코드 실행시간을 최소화하고 정확하고 효율적인 코드를 작성하는 것은 매우 중요합니다. 비트연산은 코드를 간결하게 만들고 실행 속도를 크게 향상시킬 수 있는 강력한 도구

best-coding.tistory.com

 

반응형

댓글