본문 바로가기
공부

비트연산자 & 쉬프트연산자

by MY블로그 2022. 12. 12.
●비트 연산자 ( 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 1
1 0
1 1

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://xzio.tistory.com/262

 

[C++] 비트 연산과 쉬프트 (>>, <<)

[C++] 비트 연산과 쉬프트 (>>,

xzio.tistory.com

https://studymake.tistory.com/149

 

C/C++의 비트 이동(shift)연산 (<<, >>)

비트 이동(shift) 연산자는 방향에 따라 두 가지가 있는데 는 오른쪽 이동 연산자이다. 쉬프트(shift)는 비트의 자리를 이동시킨다는 용어인데 이 연산자의 오른쪽에 적인 숫자의 자리수만큼 순차

studymake.tistory.com

 

댓글