C언어

[C언어] 쉬프트 연산과 비트 연산

_minit 2024. 10. 10. 11:46

쉬프트 연산이란?

쉬프트 연산은 이진수의 비트를 좌우로 이동시키는 연산이다. 쉽게 말해서 숫자의 비트를 좌측이나 우측으로 밀어서 새로운 값을 만드는 연산이다.

  1. 왼쪽 쉬프트(<<)
    • 비트를 왼쪽으로 민다.
    • 왼쪽 쉬프트는 곱셈처럼 동작한다. a << ba * (2^b)와 같은 결과가 나온다.
  2. 오른쪽 쉬프트(>>)
    • 비트를 오른쪽으로 민다.
    • 오른쪽 쉬프트는 나눗셈처럼 동작한다. a >> ba / (2^b)와 같은 결과가 나온다.

 

쉬프트 연산의 활용 예시

  • 비트 마스크 생성: 특정 비트를 1로 설정하거나 0으로 클리어할 때 쉬프트 연산을 많이 사용한다. 예를 들어, 1 << 300001000이 돼서 네 번째 비트를 1로 만드는 데 사용할 수 있다.
  • 빠른 계산: 곱셈과 나눗셈 대신 사용할 수 있어서 속도 최적화에 도움이 된다. x * 4 대신 x << 2를 사용할 수 있다.

 

비트 연산이란?

비트 연산은 숫자의 각 비트에 대해 논리 연산을 수행하는 것이다. C 언어에는 여러 가지 비트 연산자가 있다:

  1. AND 연산자(&)
    • 둘 다 1일 때만 1이 된다.
    • 예를 들어, 5 & 300000101 & 00000011이니까 결과는 00000001이 된다. 즉, 1이다.
  2. OR 연산자(|)
    • 둘 중 하나라도 1이면 1이 된다.
    • 예를 들어, 5 | 300000101 | 00000011이니까 결과는 00000111이 된다. 즉, 7이다.
  3. XOR 연산자(^)
    • 둘이 다르면 1이 된다.
    • 예를 들어, 5 ^ 300000101 ^ 00000011이니까 결과는 00000110이 된다. 즉, 6이다.
  4. NOT 연산자(~)
    • 각 비트를 반전시킨다. 즉, 1은 0으로, 0은 1로 바뀐다.
    • 예를 들어, ~500000101을 반전시켜서 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;
}

 

예제 설명

  1. AND 연산: a & b는 두 비트 모두 1일 때만 1이 된다.
  2. OR 연산: a | b는 하나라도 1이면 1이 된다.
  3. XOR 연산: a ^ b는 둘이 다를 때만 1이 된다.
  4. NOT 연산: ~a는 모든 비트를 반전시킨다.
  5. 왼쪽 쉬프트: a << 1은 비트를 왼쪽으로 한 칸 이동시킨다.
  6. 오른쪽 쉬프트: 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