본문 바로가기
개발/C++ (98,03,11,14,17,20,23)

Before Classic C++ : Bitwise Operators

by snowoods 2025. 10. 29.

Before Classic C++

 

비트 연산자 (Bitwise Operators)

 

개요

비트 연산자는 정수형 데이터의 비트(bit) 단위로 직접 조작하는 연산을 수행합니다. 하드웨어 제어, 데이터 압축, 암호화 알고리즘 등 저수준 프로그래밍에서 효율적인 데이터 처리를 위해 사용됩니다.

 

C++ 버전별 주요 키워드 도입 시기

  • C99 이전 (C/C++): 모든 기본 비트 연산자(&, |, ^, ~, <<, >>)는 C 언어 초기부터 존재했으며, C++에서도 처음부터 지원되었습니다.

 

내용 설명

  • & (Bitwise AND): 두 비트가 모두 1일 경우에만 결과 비트가 1이 됩니다.
  • | (Bitwise OR): 두 비트 중 하나라도 1이면 결과 비트가 1이 됩니다.
  • ^ (Bitwise XOR): 두 비트가 서로 다를 경우에만 결과 비트가 1이 됩니다.
  • ~ (Bitwise NOT): 단항 연산자로, 모든 비트를 반전시킵니다. (0은 1로, 1은 0으로)
  • << (Left Shift): 지정된 수만큼 비트를 왼쪽으로 이동시킵니다. 오른쪽의 빈자리는 0으로 채워집니다. (결과적으로 2의 거듭제곱을 곱하는 효과)
  • >> (Right Shift): 지정된 수만큼 비트를 오른쪽으로 이동시킵니다. 부호 없는(unsigned) 타입은 왼쪽 빈자리가 0으로, 부호 있는(signed) 타입은 구현에 따라 부호 비트 또는 0으로 채워집니다. (결과적으로 2의 거듭제곱을 나누는 효과)

 

예제 코드

#include <iostream>
#include <bitset>

int main() {
    unsigned char a = 0b01010101; // 85
    unsigned char b = 0b10101010; // 170

    std::cout << "a     = " << std::bitset<8>(a) << " (" << static_cast<int>(a) << ")" << std::endl;
    std::cout << "b     = " << std::bitset<8>(b) << " (" << static_cast<int>(b) << ")" << std::endl;
    std::cout << std::endl;

    std::cout << "a & b = " << std::bitset<8>(a & b) << std::endl;
    std::cout << "a | b = " << std::bitset<8>(a | b) << std::endl;
    std::cout << "a ^ b = " << std::bitset<8>(a ^ b) << std::endl;
    std::cout << "~a    = " << std::bitset<8>(~a) << std::endl;
    std::cout << "a << 1= " << std::bitset<8>(a << 1) << std::endl;
    std::cout << "b >> 1= " << std::bitset<8>(b >> 1) << std::endl;

    return 0;
}

 

실행 결과

a     = 01010101 (85)
b     = 10101010 (170)

a & b = 00000000
a | b = 11111111
a ^ b = 11111111
~a    = 10101010
a << 1= 10101010
b >> 1= 01010101

 

활용팁

  • 플래그(Flag) 관리: 하나의 정수 변수에 여러 상태(on/off)를 저장하고 관리할 때 유용합니다. 예를 들어, flags |= OPTION_A;로 옵션을 켜고, flags &= ~OPTION_B;로 옵션을 끌 수 있습니다.
  • 마스크(Mask) 사용: 특정 비트의 값을 확인하거나 변경할 때 & 연산자를 사용한 마스킹 기법이 널리 쓰입니다.