이번에는 이진수에 대한 학습을 해보도록 하자. 항상 10진수에 익숙해진 우리는 2진수, 8진수, 16진수와 같은 수를 보면 이해하기 어렵다. 그래도 한번씩 따라가 보자.
게임을 만들거나 딥러닝의 엔진을 만들때 많이 사용되니깐 한번에 이해하기 어려워도 계속 반복해서 보도록 하자.
이번에는 많이 지루할 지도 모른다. 다 아는 개념에 대해 설명할 수도 있으므로,,,,
/*
0
1
2
3
4
5
6
7
8
9
10 = 10^1 + 0
11 = 10^1 + 1
12
13
...
337 = 300 + 30 + 7 = 10^2 * 3 + 10^1 * 3 + 10^0 * 7 제곱 연산자가 없으므로 pow()를 사용한다.
*/
주의 깊게 봐야하는 것은 컴퓨터는 337을 계산할 때 위와 같은 방법으로 작동한다는 것이다.
#include <iostream>
int main()
{
using namespace std;
/*
0
1
10 = 2^1*1 + 2^0*0 == 2
11 = 2^1*1 + 2^0*1 == 3
11
+ 1
----------
100
*/
return 0;
}
2진수에 대한 개념을 안다면 쉽게 이해할 수 있다. 위의 코드를 보며 2진수 계산 과정에 대해 이해하길 바란다.
#include <iostream>
int main()
{
using namespace std;
/*
1 byte를 예로 들어보자.
2^ 7654 3210
0101 1110
2^7*0 + 2^6*1 + 2^5*0 + 2^4*1 + 2^3*1 + 2^2*1 + 2^1*1 + 2^0*0
= 128*0 + 64*1 + 32*0 + 16*1 + 8*1 + 4*1 + 2*1 + 1*0
= 64 + 16 + 8 + 4 + 2
= 94
*/
return 0;
}
2진수를 10진수로 바꾸려면 다음과 같은 동작이 필요하다. 모르겠다면 종이를 꺼내 한번씩 적어보자. 또한, 10진수를 2진수로 바꾸려면 어떻게 해야 하는지 생각해보자.
초등학교인가? 중학교인가? 기억이 가물가물하지만 2진수를 10진수로 바꾸는 과정을 배운 기억이 얼핏 난다. 나머지를 이용해 구하는 방식인데, 실제로 해보면 무슨 말인지 쉽게 와닿을 것이다.
#include <iostream>
int main()
{
using namespace std;
/*
-5를 2진수로 바꿔보자
-5
0000 0101
보수를 취한다.(complement)
1111 1010 + 1
1111 1011 <- -5
-----------------------------------
1001 1110 (음수로 이루어진 2진수)
0110 0001 (보수 취함) +1
0110 0010 -> 98 -> -98
---> 2진수로 이루어진 음의 값을 보수를 취하고 1을 더한 값을 구한다음 마지막에 -를 붙여주자.
*/
return 0;
}
2진수를 10진수로 바꾸는 것을 알았다면, 음의 2진수를 10진수로 바꾸는 것과 음의 10진수를 2진수로 바꾸는 것에 대해 알아보자.
complmet(보수)는 원래의 수에 반대 값을 넣어주고 (0 -> 1, 1 -> 0) 마지막에 +1을 더해줘 구한다. (기본 개념이므로 무조건 알아야 한다.)
2의 보수에 대해 더 깊이 정확히 알고 싶다면 https://life-with-coding.tistory.com/298 이 블로그를 참고하자.