티스토리 뷰
목차
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 // 비트 클리어 a &= ~(0x1<<5); // 한 비트 클리어 (예> 5번 비트) a &= ~(0x7<<3); // 연속된 여러 비트 클리어 (예> 5,4,3번 비트) a &= ~((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번 비트) // 비트 반전 a ^= (0x1<<5); // 한 비트 반전 (예> 5번 비트) a ^= (0x7<<3); // 연속된 여러 비트 반전 (예> 5,4,3번 비트) a ^= (0x1<<5) + (0x3<<2); // 떨어져 있는 여러 비트 반전 (예> 5,3,2번 비트) // 비트 검사 (예> 5번 비트) a & (0x1<<5) // 비트 추출 (예> 6,5,4번 비트) b = (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 |
NOT
NOT |
0111 |
= |
1000 |
NOT 연산은 각 자릿수의 값을 반대로 바꾸는 연산이며, 어떤 값의 보수를 구할 때 효과적으로 사용할 수 있습니다. C나 C++에선 아래처럼 사용합니다.
1 | x = ~y; |
OR
0101 | |
OR | 0011 |
= | 0111 |
OR 연산은 두 값의 각 자릿수를 비교해, 둘 중 하나라도 1이 있다면 1을, 아니면 0을 돌려줍니다.
1 | x = y | z; | cs |
XOR
0101 | |
XOR | 0011 |
= | 0110 |
XOR 연산은 두 값의 각 자릿수를 비교해, 값이 같으면 0, 다르면 1을 돌려줍니다.
1 | x = y ^ z; | cs |
AND
0101 | |
AND | 0011 |
= | 0001 |
AND 연산은 두 값의 각 자릿수를 비교해, 두 값 모두에 1이 있을 때만 1을, 나머지 경우에는 0을 돌려줍니다.
1 | x = y & z; | cs |
비트 연산 예제랑 설명글은 자주 보게 될 테니 잊지 말고 꼭 기억하세요.
C++ 비트 연산 예제와 설명 (Bit Not, Or, Xor, And)