본문 바로가기
C++ 200제/코딩 IT 정보

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

by vicddory 2017. 6. 29.

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)

댓글