컴퓨터의 ALU에서 연산을 수행할 때 컴퓨터는 덧셈이던 뺄셈이던 곱셈이던 나눗셈이던간에 간단히 말하자면 덧셈으로 모두 해결가능하다.
뺄셈의 경우엔 피연산자를 2의 보수로 치환하여 -형식으로 바꿔 둘이 더하는 형식이다.
곱셈의 경우엔
1001(9) * 11(3) 이라고 했을 때 각 자리 수를 계산한 값을 모두 합하여 결과를 도출할 수 있다.
더 편한 방법으로는 왼쪽으로 shift연산을 돌리면 해결되기도 한다. (이 경우엔 2의 배수를 곱하는 경우에만 성립한다.)
나눗셈의 경우엔 곱셈과 반대로 지속적으로 나누는 값으로 나누려는 값을 빼면된다.
하지만 여기에서 문제가 발생한다.
곱셈의 경우엔 이전에 계산했던 값을 알 필요가 전혀 없다.
위에서 예를 들었 듯, 1001 * 11 은 각 자리수를 ALU내부에서 모두 계산할 수 있다.
하지만 나눗셈의 경우엔 1001 / 11이라고 했을 때
맨 처음에는 나눌 수 없어 carry를 만들고 한 자리수를 내린다.
그러면 100/11은 1이 되며, 결과값으로 1이 나오게 되고, 이 값을 레지스터나 AC에 저장하여 11을 또 11로 나누는 작업을 통해 계산을 마무리 할 수 있다.
그러면 결과값으로 1001(9) / 0011(3) = 0011(3)이 나오게 된다.
이게 왜 큰 문제냐면 요즘 아무리 컴퓨터가 좋아졌다 할지라도 수가 커지면 ALU에서 자연스럽게 결과값을 구하기 위해 빼는 작업과 그 결과값을 레지스터, AC에 저장하는 과정이 늘어나며 걸리는 시간이 가파르게 늘것이다.
따라서 되도록 큰 수를 구할 때는 최적화를 위해 곱셈을 사용하자.
a / 2 == a * 0.5
'프로그래밍' 카테고리의 다른 글
Escape Sequence (0) | 2024.04.16 |
---|---|
의사코드 (0) | 2024.02.27 |
XML 파일 구조 (0) | 2024.02.07 |
백준 11047 동전 0 (0) | 2021.06.17 |
10828 스택 (0) | 2021.06.15 |