티스토리 뷰

목차

    반응형

    C++ 비트 연산 예제와 설명 (Bit Not, Or, Xor, And)


    아래는 C와 C++에서 사용할 수 있는 비트 연산 예제입니다. 별도의 헤더 파일로 만들어 사용하거나 기존의 소스에 추가하세요. C++ 비트 연산은 자주 사용되기에 잘 알아두는 것이 좋습니다. 무엇보다 잘못 사용하면 속도 매우 느려지기에 효율적인 코드를 구성하는 것이 중요합니다.


    바로 아래 예제는 비트 클리어, 비트 설정, 비트 반전, 비트 검사, 비트 추출을 나타냅니다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    unsigned char a = 0xf0;        // 11110000
     
    // 비트 클리어
    &= ~(0x1<<5); // 한 비트 클리어 (예> 5번 비트)
    &= ~(0x7<<3); // 연속된 여러 비트 클리어 (예> 5,4,3번 비트)         
    &= ~((0x1<<5+ (0x3<<2)); // 떨어져 있는 여러 비트 클리어 (예> 5,3,2번 비트)
     
    // 비트 설정
    |= (0x1<<5); // 한 비트 설정 (예> 5번 비트)                         
    |= (0x7<<3); // 연속된 여러 비트 설정 (예> 5,4,3번 비트)            
    |= (0x1<<5+ (0x3<<2); // 떨어져 있는 여러 비트 설정 (예> 5,3,2번 비트)       
     
    // 비트 반전
    a ^= (0x1<<5); // 한 비트 반전 (예> 5번 비트)                         
    a ^= (0x7<<3); // 연속된 여러 비트 반전 (예> 5,4,3번 비트)            
    a ^= (0x1<<5+ (0x3<<2); // 떨어져 있는 여러 비트 반전 (예> 5,3,2번 비트)       
     
    // 비트 검사 (예> 5번 비트)                            
    & (0x1<<5)
     
    // 비트 추출 (예> 6,5,4번 비트)                        
    = (a>>4& 0x7;
    cs


    위의 소스를 매크로로 변환하면 아래처럼 표현할 수도 있습니다.

    사실, 저는 위의 코드보단 아래 코드를 선호하는 편이라 static 함수에 담아놓고 사용하는 편이죠.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // 파일 이름 : macro.h
    // 
    #define clear_bit(data, loc)          ((data) &= ~(0x1<<(loc)))            // 한 비트 클리어
    #define clear_bits(data, area, loc) ((data) &= ~((area)<<(loc)))         // 연속된 여러 비트 클리어
    #define set_bit(data,loc)              ((data) |= (0x1<<(loc)))             // 한 비트 설정
    #define set_bits(data,area,loc)      ((data) |= ((area)<<(loc)))          // 연속된 여러 비트 설정
    #define invert_bit(data,loc)           ((data) ^= (0x1<<(loc)))             // 한 비트 반전
    #define invert_bits(data,area,loc)   ((data) ^= ((area)<<(loc)))          // 연속된 여러 비트 반전
    #define check_bit(data,loc)           ((data) & (0x1<<(loc)))              // 비트 검사
    #define extract_bits(data,area,loc) (((data)>>(loc)) & (area))
    cs

    그리고 비트 연산을 잘 모르신다면, 아래 글을 읽어보세요. 간단한 비트 연산 설명입니다. (출처는 위키백과 비트 연산)

    C++ 비트 연산 예제와 설명 (Bit Not, Or, Xor, And)[C++ 비트 연산 예제와 설명 (Bit Not, Or, Xor, And)]


    NOT


    NOT 

     0111

     1000


    NOT 연산은 각 자릿수의 값을 반대로 바꾸는 연산이며, 어떤 값의 보수를 구할 때 효과적으로 사용할 수 있습니다. C나 C++에선 아래처럼 사용합니다.


    1
    = ~y;

    cs


    OR



     0101

    OR 

     0011

    = 

     0111


    OR 연산은 두 값의 각 자릿수를 비교해, 둘 중 하나라도 1이 있다면 1을, 아니면 0을 돌려줍니다.


    1
    = y | z;
    cs


    XOR



     0101

    XOR 

     0011

     0110


    XOR 연산은 두 값의 각 자릿수를 비교해, 값이 같으면 0, 다르면 1을 돌려줍니다.


    1
    = y ^ z;
    cs


    AND



     0101

    AND 

     0011

     0001


    AND 연산은 두 값의 각 자릿수를 비교해, 두 값 모두에 1이 있을 때만 1을, 나머지 경우에는 0을 돌려줍니다.


    1
    = y & z;
    cs


    비트 연산 예제랑 설명글은 자주 보게 될 테니 잊지 말고 꼭 기억하세요.


    C++ 비트 연산 예제와 설명 (Bit Not, Or, Xor, And)

    반응형