C++에서 비트 조작 이해하기

비트 조작은 프로그래밍의 중요한 측면이며, 특히 시스템 프로그래밍과 C, C++와 같은 저수준 언어에서 중요합니다. 숫자의 개별 비트를 조작할 수 있는 능력은 기본적인 작업 중 하나입니다. 이는 성능을 향상시키고 데이터 표현 및 작업에 대한 세밀한 제어를 제공합니다.

이 블로그 게시물에서는 C++를 사용하여 정수에서 설정, 지우기, 전환하기를 통해 단일 비트를 조작하는 방법을 살펴보겠습니다. 또한 비트의 값을 확인하고 비트의 상태에 따라 수정하는 방법에 대해서도 다룰 것입니다.

비트 설정하기

숫자의 n번째 비트를 1로 설정하기 위해 비트 단위 OR (|) 연산자를 사용할 수 있습니다. 이 연산자는 두 비트 패턴을 결합할 수 있으며, 두 피연산자 중 하나라도 1인 경우 1이 됩니다.

다음은 이를 구현하는 방법입니다:

typedef unsigned long Uint;

inline Uint bit_set(Uint number, Uint n) {
    return number | ((Uint)1 << n);
}

중요한 주의 사항:

Uint의 너비보다 큰 비트 위치를 시프트하지 않도록 주의하십시오. 이는 정의되지 않은 동작을 초래할 수 있습니다.

비트 지우기

n번째 비트(즉, 0으로 설정하기)를 지우기 위해 비트 단위 AND (&) 연산자를 사용합니다. 먼저 비트 단위 NOT (~) 연산자를 사용하여 비트를 반전시켜야 합니다. 다음은 구현 방법입니다:

inline Uint bit_clear(Uint number, Uint n) {
    return number & ~((Uint)1 << n);
}

비트 전환하기

때때로 비트의 상태를 1에서 0으로 또는 0에서 1로 변경해야 할 수도 있습니다. 이 작업은 전환이라고 하며, 비트 단위 XOR (^) 연산자를 사용하여 효율적으로 수행할 수 있습니다:

inline Uint bit_toggle(Uint number, Uint n) {
    return number ^ ((Uint)1 << n);
}

비트 확인하기

처음에 요청되지 않았지만, 특정 비트가 1인지 0인지 확인하는 방법을 아는 것은 중요합니다. 다음은 비트 단위 연산을 사용하여 이를 구현하는 방법입니다:

inline bool bit_check(Uint number, Uint n) {
    return (number >> n) & (Uint)1;
}

n번째 비트를 x로 변경하기

n번째 비트를 특정 값 x(0 또는 1)으로 변경하고자 한다면, 가장 좋은 방법은 먼저 비트를 지운 후(bit_clear 사용) 원하는 값으로 설정하는 것입니다(bit_set 사용). 다음은 이를 달성하기 위한 간단한 함수입니다:

inline Uint bit_set_to(Uint number, Uint n, bool x) {
    return (number & ~((Uint)1 << n)) | ((Uint)x << n);
}

이 함수들은 GCC와 clang과 같은 컴파일러를 사용하여 최적의 코드 생성을 위해 테스트되었습니다. 이들의 성능을 Godbolt에서 확인할 수 있습니다.

요약하자면, 이러한 비트 조작 기술을 이해하고 적용하면 C++에서 더 효율적이고 효과적인 코드를 작성할 수 있습니다. 이들을 숙달하면 더욱 복잡한 문제를 쉽게 해결할 수 있는 힘을 얻게 될 것입니다!