본문 바로가기
Study/c,c++

비트 연산 기본

by 개발새-발 2021. 5. 5.
반응형

이 글은 기본적인 비트 연산을 다룬다.

L shift << 

비트들을 왼쪽으로 민다. n << i 는 n을 왼쪽으로 i번 밀겠다는 의미이다. 만약 n이 5라고 하자. 5는 이진수로 0000101(2)이다. n << 2는 0010100(2) 이 된다. 이는 10진수로 20이다.

 

R shift >>

비트들을 오른쪽으로 민다. n >> i 는 n을 오른쪽으로 i번 밀겠다는 의미이다. n = 0000101(2) 일 때 n >> 2는 0000001(2)이 된다.

cout << "Shift" << endl;
cout << (5 << 2) << endl;
cout << (5 >> 2) << endl;
cout << endl;

cout << "L shift with 1" << endl;
cout << (1 << 0) << endl;
cout << (1 << 1) << endl;
cout << (1 << 2) << endl;
cout << (1 << 3) << endl;
cout << endl;

cout << "R shift with 32" << endl; 
cout << (32 >> 0) << endl;
cout << (32 >> 1) << endl;
cout << (32 >> 2) << endl;
cout << (32 >> 3) << endl;
cout << endl;
Shift
20
1

L shift with 1
1
2
4
8

R shift with 32
32
16
8
4

 

AND &

2진수로 변환하였을 때 각 자리수에 대해 계산된다. 계산하려는 자릿수에서 두 수의 비트 값이 둘 다 1일 때 1이다. 예를 들어 이진수로 1001(2), 0101(2)에 대해 AND연산을 진행하면 출력은 0001(2)이다.

  1 0 0 1
& (AND) 0 1 0 1
  0 0 0 1

0101(2)은 10진수로 각각 9,5이다. 9&5의 값이 우리가 예상한 값과 같은지 확인해보자.

cout << (9&5) << endl;
1

 

 

OR |

각 자리수에서 두 비트 중 하나라도 1이면 1이 된다. 같은 수로 1001(2)과 0101(2)로 연산을 해보자.

  1 0 0 1
| (OR) 0 1 0 1
  1 1 0 1

9|5의 값이 13인가?

cout << (9|5) << endl;
13

 

XOR ^

각 자리수에서 두 비트의 값이 같지 않으면 1이다. 다시 말하면, 둘 다 0이거나 둘 다 1이면 0이고 아닐 경우 1이다. 1001(2)과 0101(2)로 연산을 해보자.

  1 0 0 1
^ (XOR) 0 1 0 1
  1 1 0 0

9^5 가 12가 맞는가?

cout << (9^5) << endl;
12

 

NOT ~

각 자리의 모든 비트를 반전한다. 만약 4비트의 수 0101(2)에 NOT연산을 취해주면 1010(2)가 된다. 32 비트의 수 0000 1010 0000 1010 1111 0000 1111 0000 (2)로 한번 NOT 연산을 해보자. 이는 10진수로 168489200이다.

~ (NOT) 0000 1010 0000 1010 1111 0000 1111 0000
  1111 0101 1111 0101 0000 1111 0000 1111

NOT연산의 결과를 10진수로 읽으면 4126478095이다.

unsigned int a = 168489200;
cout << (unsigned int) ~a << endl;
4126478095

 

다음에는 비트연산을 활용해볼 것이다.

반응형

댓글