이 글은 기본적인 비트 연산을 다룬다.
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
다음에는 비트연산을 활용해볼 것이다.
'Study > c,c++' 카테고리의 다른 글
비트마스크 (0) | 2021.05.08 |
---|---|
c++에서 class의 private 멤버를 일반적이지 않은 방법으로 읽기 (0) | 2021.04.25 |
C/C++서 양수 정수 나눗셈 결과의 올림 구하기 (0) | 2021.03.01 |
Scanf의 형식지정자에 대하여 (0) | 2021.02.26 |
댓글