우선 보수에 대해 알아보기 전에 간단히 알아볼 개념들이 있다.
일단 진법의 밑수. 밑수는 각 진법에서 기호에 사용되는 숫자의 수를 밑수라고 한다.
10진법에서의 밑수는 10, 2진법에서의 밑수는 2, 8진법에서의 밑수는 8이다.
또한 모든 진법에서 밑수는 0부터 시작한다. 2진법에서의 밑수는 0과 1,
10진법에서의 밑수는 0, 1, 2, 3, 4, 5, 6, 7, 8, 9와 같이 10개이다.
이제 여기서 보수를 설명할 수 있다.
보수란, 두 수의 합이 진법의 밑수가 되게 하는 수라고 할 수 있다.
10진법에서 4의 10의 보수는 6이고, 2의 10의 보수는 8이다.
그렇다면 100에 대한 10의 보수는? 900이다,
10을 맞추는 게 아닌, 10진법에서 자릿수를 올라가게 하는 수라고 생각하면 된다.
이 보수의 개념을 이용해 컴퓨터에서 비트 연산을 하는 것이다.
우선 컴퓨터는 N개의 비트를 이용해 2^N개의 정수만을 표현할 수 있다. 2진법이다.
또한 저번에 언급했던 것처럼 양수와 음수 모두 비트로 표현을 해줘야 하기 때문에
최상위 비트를 기호 비트로 설정해서 간단하게 표시하기도 한다고 했다.
하지만 연산을 할 때는 불편한 점이 많다. 음수와 양수의 덧셈과 같은 연산을 할 때 말이다.
이에 컴퓨터는 이를 계산할 때 보수 개념을 사용한다.
A-B를 계산할 때, B의 보수인 -B를 구한 다음 A+ (-B)로 계산하는 것이다.
그렇다면 보수는 어떻게 구할까?
100의 10의 보수는 900이라고 헀다. 그렇다면 100의 9의 보수는?
이는 간단하게 100의 10의 보수에서 1을 빼면 된다.
즉, 100의 9의 보수는 900-1인 899인 것이다.
이는 다르게 표현할 수 있다.
10진법은 9에 한해서, 2진법은 1에 한해서,
n진법은 n-1의 보수에 한해서, 그 자릿수에서 가질 수 있는 최댓값 - K가 보수가 된다.
10진법에서 K의 9의 보수는 K의 최대 자릿수 값 - K가 된다.
K가 100이라면 999가 최대 자릿수 값이니 9의 보수는 899이다.
그렇다면 반대로도 가능하겠지?
10진법에서 100의 9의 보수는 899이니 1을 더하면 10의 보수가 된다.
2진법에서도 마찬가지다.
2진수 1010의 1의 보수는 1111에서 1010을 뺀 값이다.
즉 0101이다.
최대 자릿수 값 -K 인 것이다.
여기서 2의 보수를 구하려면? 그냥 1 더해주면 된다.
즉, 1010의 2의 보수는 0110이다.
그렇다면 음수의 보수는??
만약 -6 을 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 으로 표현했다고 하자.
그럼 -6의 1의 보수는 자릿수 최댓값에서 빼주면 되는데,
여기서 최상위 비트는 음수를 표현하기 때문에 그대로 가져가고 나머지는 계산해주면
1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 이 -6의 1의 보수가 된다.
여기서 1을 더하면 -6의 2의 보수가 된다.
라고 이해했다.
'알고리즘 > 알고리즘' 카테고리의 다른 글
비트마스크(BitMask) - 비트 연산 (0) | 2023.03.22 |
---|---|
분할 정복 (0) | 2023.03.22 |
2진수, 8진수, 10진수, 16진수 (0) | 2023.03.21 |
시간 복잡도 (0) | 2023.03.21 |
복잡도 (0) | 2023.03.21 |