●비트 연산자 ( Bitwise Operators )
비트 단위 연산자는 비트의 수준에서 정보를 조작할 수 있게 해주는 것 이다.
일반적으로 자주 사용하지는 않지만 화상이나 음성, 압축한 정보들을 다룰 경우 사용 된다.
비트 관점에서의 정보는 2진수 ( 0 / 1 ) 만으로 표현이 된다.
실제 프로그래밍에서는 2진수로의 변환이 용이한 16진수를 많이 사용한다.
따라서 2진수, 10진수, 16진수의 관계와 변환을 알고 있어야 한다.
보통 2진수와 10진수 사이의 변환은 쉬울 것이지만
16진수에서 10진수 그리고 그 반대의 경우 한번에 변환하기가 쉽지 않다.
때문에 2진수로 변환 단계를 거친뒤 변환한다면 보다 수월한 변환이 가능 하다.
2진수 : 1010110101
2진수 : (0010) (1011) (0101) -> 뒤에서 4자리씩 묶고 모자라는 자리는 0으로 채운다.
16진수 : 2 / B / 5
16진수에서 2진수로의 변환도 역으로 4자리씩 풀어내면 된다.
아래의 코드는 정수 값을 2진수로 출력하는 코드이다.
#include <bitset>
#include <iostream>
using namespace std;
int main(){
char c = 1; // 8비트
short int si = 2; // 16비트
int i = 4; // 32비트
cout << "c= " << bitset<8>(c) << "(" << (int)c << ")" << endl;
cout << "si= " << bitset<16>(si) << "(" << si << ")" << endl;
cout << "i= " << bitset<32>(i) << "(" << i << ")" << endl;
return 0;
}
출력 결과
●비트 단위 논리 연산자
비트 단위 논리 연산자는 피연산자의 각 비트에 대해서 논리 연산을 수행한다.
피연산자1 | 피연산자2 | 결과 | ||
AND(&) | OR( | ) | XOR( ^ ) | ||
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 0 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
OR ( | ) 연산자는 논리 OR 연산자와 비슷하게 비트 두개 중 하나라도 1이면 무조건 1로 평가
피연산자1 | OR 연산자 | 피연산자2 | 결과 |
5 (0101) | | | 6 (0110) | 7 (0111) |
AND ( & ) 연산자는 논리 AND 연산자와 비슷하게 두 개의 비트 모두 1인 경우에만 1로 평가
피연산자1 | AND 연산자 | 피연산자2 | 결과 |
5 (0101) | & | 6 (0110) | 4 (0100) |
XOR ( ^ ) 연산자는 한개의 피연산자만 1인 경우에만 1로 평가. 두 비트 모두 1인 경우에는 0으로 평가
피연산자1 | XOR 연산자 | 피연산자2 | 결과 |
5 (0101) | ^ | 6 (0110) | 5 (0101) |
●쉬프트 연산자 ( Shift Operation )
쉬프트 연산이란 비트를 몇 칸씩 옆으로 이동하는 연산을 의미한다.
방향에 따라 두 가지가 있는데 << 연산자는 왼쪽 방향 이동 연산자 이고
>> 연산자는 오른쪽 방향 이동 연산자 이다. 연산자의 우측에 적힌 숫자만큼 각방향으로 이동한다.
평소 사용하는 화살표 방향과 같으니 방향을 이해하는데는 쉬울 것이다.
사용 문법은
var << n ( 왼쪽으로 n 만큼 이동)
var >> n ( 오른쪽으로 n 만큼 이동)
green >> 5; // green 변수의 값을 오른쪽으로 5비트 이동 시킨다.
// 사용 예시
green : 0000001000100000
green >> 5 : 0000000000010001
blue << 5; // blue 변수의 값을 왼쪽으로 5비트 이동 시킨다.
blue : 0000000001000100
blue << 5 : 0000100010000000
위의 예시처럼 비트가 이동하면서 새롭게 채워지는 비트들은 0으로 채워지게된다.
하지만 음수의 값을 쉬프트 할 때에는 0이아닌 1이 채워진다.
비트들이 자리를 이동 하게 되면서 밀려나는 버려지는 비트들이 있으며 반대로 채워야되는 자리가 생기게 되는데
두 가지 경우 약간의 차이가 있다.
먼저 왼쪽으로 비트들을 이동시키는 << (왼쪽 쉬프트) 연산의 경우 비트들이 왼쪽으로 자리를 이동하게 되면
비는 공간을 0으로 채우게 되며 자리 이동으로 인해 밀려나가는 비트들은 모두 버려지게 되는 것이다.
반면 오른쪽으로 비트들을 이동시키는 >> (오른쪽 쉬프트) 연산의 경우 오른쪽으로 밀려나가는 비트들은 버려지지만
좌측에 생기는 빈 공간에는 부호가 없는 데이터형이면 0으로, 반대로 부호가 있는 데이터형은 부호를 유지시키기 위해서
원래 변수 값의 최상위비트(MSB)로 채운다. ( MSB가 0이면 양수 1이면 음수를 의미한다!)
알아두자
MSB - Most Significant Bit : 가장 큰 자릿수의 비트, 즉 가장 왼쪽 비트
LSB - Least Significant Bit : 가장 작은 자릿수의 비트, 즉 가장 오른쪽 비트
참조 사이트
https://studymake.tistory.com/149
'공부' 카테고리의 다른 글
C++ 추상클래스 / 인터페이스 참조 (0) | 2022.12.13 |
---|---|
C++ 디자인패턴 - 싱글톤(싱글턴) (0) | 2022.12.12 |
수학 - 삼각 함수 / 삼각비 (0) | 2022.12.06 |
Win32 API 프로시저 / 메시지 / 메시지 루프 / 메시지 큐 (0) | 2022.12.03 |
C++ 메모리영역 복습 (1) | 2022.12.01 |
댓글