ISSAC.Min

[C++ Basic] 연산자(Operator) / 비트 연산자(Bitwise Operator) 본문

Programming Language/C++ Basic

[C++ Basic] 연산자(Operator) / 비트 연산자(Bitwise Operator)

ISSAC.M 2019. 4. 10. 22:08
반응형

 1. 비트 연산자(Bitwise Operator)


비트 연산자(Bitwise Operator)논리 연산자랑 비슷한 비트 논리 연산자와 비트를 이동시킬 수 있는 시프트 연산자로 나눌 수 있다. 사실 C/C++를 통한 디바이스를 직접 제어하는 것이 아니라면 비트 연산자를 크게 쓸일은 없다고 볼 수 있다. 필자 또한 비트 연산자를 써본적은 학교 강의 실습시간이 전부인 것 같지만 연산자고 크게 어려운 내용은 없으니 기억해 놓자.


비트 논리 연산자는 논리 연산자와 비슷하게 &, |, ^, ~ 등을 사용하며 아래와 같다.


 연 산 자

설 명

 &

같은 위치간 비트가 모두 1일때만 1을 반환한다.

|

같은 위치간 비트가 모두 0일때만 0을 반환한다.

^

같은 위치간 비트가 다를 경우 1을 반환한다.

~

비트의 수를 반전한다. 


위의 설명만 본다면 이해가 어려울 것이다.  아래의 예시를 보자.

(int 자료형은 표현하기 크기 때문에 뒷부분에 필요한 부분만 명시)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
using namespace std;
  
int main() {
// num1의 2진수값은 0000000000001010
// num2의 2진수값은 0000000000000110
  short num1 = 10, num2 = 6;

// num3값이 num1 & num2
// 두 수의 각 자리의 비트값이 모두 1일때만 1을 반환
// 그러므로 num3는 2진수 값으로 0000000000000010
// 2진수 0000000000000010은 10진수로 변환하면 2
  short num3 = num1 & num2;

// 2
  cout << num3 << endl;
  return 0;
  }
cs

<비트 논리 연산자 &의 예시>


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
using namespace std;
  
int main() {
// num1의 2진수값은 0000000000001010
// num2의 2진수값은 0000000000000110
  short num1 = 10, num2 = 6;

// num3값이 num1 | num2
// 두 수의 각 자리의 비트값이 모두 0일때만 0을 반환
// 그러므로 num3는 2진수 값으로 0000000000001110
// 2진수 0000000000001110은 10진수로 변환하면 14
  short num3 = num1 | num2;

// 14
  cout << num3 << endl;
  return 0;
  }
cs

<비트 논리 연산자 |의 예시>


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
using namespace std;
  
int main() {
// num1의 2진수값은 0000000000001010
// num2의 2진수값은 0000000000000110
  int num1 = 10, num2 = 6;

// num3값이 num1 ^ num2
// 두 수의 각 자리의 비트값이 다를때 1을 반환
// 그러므로 num3는 2진수 값으로 0000000000001100
// 2진수 0000000000001100은 10진수로 변환하면 12
  int num3 = num1 ^ num2;

// 12
  cout << num3 << endl;
  return 0;
  }
cs

<비트 논리 연산자 ^의 예시>


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
using namespace std;
  
int main() {
  // num1의 2진수 값은 0000000000001010
  short num1 = 10;
 
  // num1의 반전은 0000000011110101
  // 0000000011110101을 10진수로 변환하면 -11
  short num2 = ~num1;
 
  // -11
  cout << num2 << endl;
  return 0;
  }
cs

<비트 논리 연산자 ~의 예시>


시프트 연산자는 >>, <<가 있으며 설명은 아래와 같다.


 연 산 자

설 명 

<<

지정한 수만큼 왼쪽으로 비트들을 이동시킨다.

>>

지정한 수만큼 오른쪽으로 비트들을 이동시킨다.


시프트 연산자는 Shift 즉 옮기다는 뜻을 가진 연산자이며 방향에 따라 왼쪽이나 오른쪽으로 비트를 이동하는 것이다. 예시를 들어보면 아래와 같다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
using namespace std;
 
int main() {
  // num1의 2진수 값은 0000000000001010
  short num1 = 10;
 
  // num2는 num1의 비트를 왼쪽으로 한칸 이동한다.
  // num2의 2진수 값은 0000000000010100
  // 이동하고 빈 곳은 0으로 대체되고 초과되는 비트는 사라진다.
  // 0000000000010100를 10진수로 변환하게 된다면 20
  short num2 = num1 << 1;
 
  // 20 
  cout << num2 << endl;
  return 0;
}
cs

<시프트 연산자 <<의 예시, >>도 동일하다.>


 2. 실습



반응형