* 틀린 내용이 있다면 알려주세요! 개인 공부 목적으로 전공 복습/예습을 위해 쓰는 글이라 틀린 부분이 있을 수 있습니다. 틀린 내용을 알려주시면 제게도 도움이 됩니다 :)
* 해외 대학을 재학 중이기 때문에 영어 사용이 조금 많을 수 있지만 최대한 한국어로 번역하려 노력중입니다.
* 효율적인 타이핑을 위해 "~이다" 의 문체를 사용합니다. 양해 부탁드립니다!
지난 번 올린 2진수 변환과 보수 글에서 2진수의 덧셈과 뺄셈에 대해 적지 않아서 이번 글에 적어 보려 합니다. 보수를 이용한 뺄셈 계산도 포함하고 있습니다!
Chapter 1: 2진수의 계산, 보수를 이용한 계산법
2진수의 덧셈과 뺄셈
먼저 2진수의 덧셈은, 1+1 일때 0이고 carry 가 발생한다는 점에 주의 하면 된다. 나머지는 평소 하는 덧셈과 같다.
위의 예시를 보면 6과 13을 더해주었는데, 1+1 일 경우 앞자리 수로 carry 1을 올려주고 더하기를 그대로 진행하면 된다.
2진수의 뺄셈은, 0-1일때 1이 되고 앞자리수에서 빌려온 borrow 만 주의해주면 된다. 나머지 또한 평소의 뺄셈과 같다.
위의 예시를 보면 13에서 6을 빼 주었는데, 뒷자리부터 순차적으로 그 과정을 파란색으로 적었다. borrow 가 발생한 부분을 0-1=1 으로 적어주고 빌려온 자리의 수에 -1을 해준다.
2진수의 곱셈과 나눗셈
이제 곱셈과 나눗셈을 알아보자. 곱셈은 1x1 일때만 1, 나머지의 경우 (0을 포함한 경우)는 모두 0이다. 우리가 10진수에서 곱하기를 할 때 어떠한 숫자라도 0을 곱해주면 0이 되는것과 같다.
6x13 예시를 보면 평소 곱하기를 진행하듯 뒷 숫자부터 차근차근 곱하기를 진행해 모두 더해주면 된다.
나눗셈은 뺄셈으로 진행되고, 나누는 수보다 나눠질 수의 부분이 같거나 클 때 몫이 1이 되고 작은 경우 0이 된다.
파란색부터 순서대로 보면, 나누는 수는 10 이고 나누어질 수의 부분은 11이다. 10<11 이므로 몫은 1이 된다.
그리고 11-10을 진행해 나온 수 역시 나누는 수 10과 비교해 10=10이므로 몫에 1을 적어준다.
그리고 10-10=0이므로, 10>00 을 비교하면 나누는 수 10이 크기에 몫에 0을 적어준다. 그리고 빼기를 진행해 나머지가 0인 것을 확인한다.
1의 보수를 이용한 뻴셈 (subtraction with 1's complement) : (r-1)의 보수
2진수를 이용한 덧셈/뺄셈, 그리고 곱셈/나눗셈을 보았는데, 우리가 하는 뺄셈은 컴퓨터가 하는 계산법과 다르다.
컴퓨터는 우리와 같은 방법의 뺄셈을 진행하지 못하므로 (덧셈을 사용해 연산한다) 지난번 글에 작성했던 보수 (complement of numbers) 를 사용하여 뺄셈을 한다.
먼저 1의 보수를 이용한 뺄셈은 아래의 두 규칙을 외우면 된다.
- n+1 번째 자릿수의 수가 발생할 경우, 그 수를 제일 오른쪽으로 옮겨 더해준다
- n번째 자릿수의 수가 0이 아닐 경우, 그 값의 1의 보수를 구해 음수 부호 (-) 를 달아준다
각각의 예시를 보자.
왼쪽의 예시 84-67 을 보면, 먼저 음수인 67(10), 2진수로 1000011(2) 인 수의 1의 보수를 구해준다.
(2진수에서 1의 보수는 모든 비트를 뒤집으면 된다)
그러면 0111100(2) 가 나오고, 이 보수와 84(10), 2진수로는 1010100(2) 인 수와 더해준다.
이때 더해주면서 원래의 n번째 자릿수보다 더 큰 n+1 번째의 자릿수가 생기는데, 이 추가 자릿수의 수를 제일 오른쪽으로 옮겨 더해주면 정답이 된다.
오른쪽의 예시는 먼저 음수의 1의 보수를 구하고 두 수를 더해준다. 그리고 n 번째 자릿수가 0이 아닐 때, 1의 보수를 다시 한번 더 구해주고 음수 부호 (-) 를 달아주면 정답이 된다.
2의 보수를 사용한 뺄셈 (subtraction with 2's complement) : r의 보수
2의 보수를 사용한 뺄셈은 아래의 두 가지 규칙이 있다.
- n+1 번째 자릿수 버리기
- n번째 자릿수가 0이 아닐 경우 2의 보수를 구해주고 음수 부호(-)를 달아준다
(2의 보수는 1의 보수를 구한 후 +1 을 해주면 된다. 모든 비트를 뒤집고 +1)
왼쪽의 예시를 보면 음수의 2의 보수를 구하고 더한 수 n+1자릿수를 버려주면 정답이 되는 것을 알 수 있다.
오른쪽 역시 n번째 자릿수가 0이 아닌 경우 그 값의 2의 보수를 구한 후 -부호를 달아주면 정답이 된다.
위의 예시들은 2진수를 사용하였지만, 10진수를 사용할 경우도 방법은 같다.
아래의 예시는 10진수에서 r의 보수를 이용한 뺄셈이다.
*10진수의 (r-1)의 보수를 이용한 뺄셈 또한 위에서 2진수를 이용해 보여준 것과 방법이 같으므로 예시를 생략합니다!
Summary
- 2진수의 덧셈은, 1+1 일때 0이고 carry 가 발생 (1+1=0, carry)
- 2진수의 뺄셈은, 0-1일때 1이 되고 앞자리수의 borrow 주의 (0-1=1, borrow)
- 곱셈은 1x1 일때만 1
- 나눗셈은 뺄셈으로 진행되고, 나누는 수보다 나눠질 수의 부분이 같거나 클 때 몫이 1이, 작은 경우 0
- 1의 보수를 이용한 뺄셈:
- n+1 번째 자릿수의 수가 발생할 경우, 그 수를 제일 오른쪽으로 옮겨 더해준다
- n번째 자릿수의 수가 0이 아닐 경우, 그 값의 1의 보수를 구해 음수 부호 (-) 를 달아준다
- 2의 보수를 이용한 뺄셈:
- n+1 번째 자릿수 버리기
- n번째 자릿수가 0이 아닐 경우 2의 보수를 구해주고 음수 부호(-)를 달아준다
적고 나니 내용이 생각보다 조금 길어서 지난번 글에 함께 넣었다면 너무 길어질 뻔 했네요!
다음 글은 부울대수에 대해 정리해보려 합니다.
'Year2 > Digital Logic Design 1' 카테고리의 다른 글
[2.2] DLD I (디지털 논리 설계): 부울대수 Boolean Algebra, 최대항 최소항 (0) | 2024.04.09 |
---|---|
[2] DLD I (디지털 논리 설계): 부울대수, Boolean Algebra (1) | 2023.09.06 |
[1.1] DLD I (디지털 논리 설계): r진수 변환 & 보수, number base conversions & complement of numbers (0) | 2023.08.28 |