Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C/C++에서 비트를 설정, 해제, 토글하는 방법

C, C++, Python 등 비트 연산을 지원하는 모든 프로그래밍 언어에서는 비트 연산자(bitwise operator)를 사용해 특정 비트를 설정(set), 해제(clear), 토글(toggle)할 수 있습니다. 이때 원하는 위치의 비트를 지정하기 위해 비트 시프트 연산자(<<)도 함께 사용합니다.

비트 설정(Set)하기

특정 비트를 1로 설정하려면 비트 OR 연산자(|)를 사용합니다. 1을 원하는 자리만큼 왼쪽으로 시프트한 값과 기존 값을 OR 연산하면 해당 비트만 1이 됩니다.

예제 코드

#include<iostream>
using namespace std;
int main() {
    int i = 0, n;
    
    // 설정할 비트 위치 입력:
    cin >> n;
    i |= (1 << n); // i와 n칸 시프트한 1의 OR 연산
    cout << i;
    return 0;
}

실행 결과

4를 입력하면 다음과 같은 결과가 출력됩니다.

16

16은 이진수로 10000이기 때문입니다. 즉, 0번째부터 세어 네 번째 비트가 1로 설정된 것입니다.

비트 해제(Clear)하기

특정 비트를 0으로 만들려면 비트 AND 연산자(&)비트 NOT 연산자(~)를 함께 사용합니다. 시프트한 1을 NOT으로 반전시키면 해당 비트만 0이고 나머지는 모두 1인 마스크가 만들어지며, 이를 AND 연산하면 대상 비트만 꺼집니다.

예제 코드

#include<iostream>
using namespace std;
int main() {
    // i는 이진수로 110
    int i = 6, n;
    
    // 해제할 비트 위치 입력:
    cin >> n;
    i &= ~(1 << n); // n칸 시프트한 1을 반전시킨 값과 AND 연산
    cout << i;
    return 0;
}

실행 결과

1을 입력하면 다음과 같은 결과가 출력됩니다.

4

이진수 110에서 첫 번째 비트가 꺼져 100이 되었고, 이는 십진수로 4에 해당합니다.

비트 토글(Toggle)하기

특정 비트를 반전시키려면(0이면 1로, 1이면 0으로) 비트 XOR 연산자(^)를 사용합니다. XOR은 같은 값끼리 연산하면 0, 다른 값끼리 연산하면 1이 되므로, 대상 비트의 상태를 손쉽게 뒤집을 수 있습니다.

예제 코드

#include<iostream>
using namespace std;
int main() {
    // i는 이진수로 110
    int i = 6, n;
    
    // 토글할 비트 위치 입력:
    cin >> n;
    i ^= (1 << n); // n칸 시프트한 1과 XOR 연산
    cout << i;
    return 0;
}

실행 결과

1을 입력하면 다음과 같은 결과가 출력됩니다.

4

이진수 110의 첫 번째 비트가 반전되어 100이 되었으며, 이는 십진수 4와 같습니다.

정리

  • 설정(Set): i |= (1 << n)
  • 해제(Clear): i &= ~(1 << n)
  • 토글(Toggle): i ^= (1 << n)

이 세 가지 패턴은 임베디드 프로그래밍, 플래그 관리, 알고리즘 문제 해결 등에서 매우 자주 사용되는 필수 기법이므로 꼭 익혀두는 것이 좋습니다.