2진수의 덧셈과 뺄셈은 간단한데요
곱셈의 경우에
01010 에 2를 곱한다고 하면
10100 으로 shift 1칸만 하면 되니까요 쉬운데요
3이나 5등 홀수를 곱해야 할때는 컴퓨터 내부적으로 어떤
방식으로 계산을 하게되는지 궁금합니다.
마찬가지로 나눗셈의 경우
짝수를 제외하고
홀수를 나누었을때..
어셈에서는 DIV 명령어로 몫과 나머지를 구하는데요
내부원리가 궁금합니다.
자세한 답변부탁드립니다.
CPU가 내부적으로 어떻게 하는지 저도 모르지만 이런 곱셈방법이 있습니다.
예를 들어서 x값에 5를 곱한다고 하죠.
5를 이진수로 0101b 가 되겠군요.
여기서 1을 하나씩만 취해서 각각 이진수로 나열하면 0100b, 0001b
첫번째수 은 1이 왼쪽으로 :!: 2번, 두번째 수는 :!: 0번이군요.
이렇게 나오죠? 이제 곱셈이 아닌 쉬프트만으로 이를 계산할수 있게 됩니다.
(x << :!: 2) + (x << :!: 0) = "x * 5 를 한 결과와 같은 수"
이렇게 되죠.
검산해볼까요?
x를 4라고 합시다.
(4 * 5) = (4 << 2) + (4 << 0) = 16 + 4 = 20.
맞죠? 곱셈보다 쉬프트가 빠르다는 이유 하나만으로 이것은
유용한 계산법이 되겠네요.
나누기는 쉬프트 반전해서 하는거 뻔하고... 나머지는 AND하면 되는거고...
아마도 CPU logic은 피연산자를 rol해가면서 비트 1을 만나면 이처럼 계산할지도 모른다는 생각을 저는 굳게 믿고 있습니다.
leal (%eax,%eax,4),%ebx 이렇게 하면 %ebx = %eax *5가 됩니다. 실제로는 %ebx = %eax + %eax * 4지만요. leal 명령은 1 클럭 싸이클에 불과하므로 간단한 홀수 곱셈을 매우 빠르게 할 수 있습니다.
leal (%eax,%eax,4),%ebx
위에 곱하기는 정말 신기하게도 되는군요..^__________^; 나누기도 간단하게 서식을 써줄수 없나요?? 위 말을 제가 이해를 잘 못하겠어요....^_^
꼬리: 좋은 내용 감사합니다.^^;
. 마음을 가꾸는 방법은??
곱하기는 있는데 나누기 없는 CPU도 있는데 (곱하기 없는 것도 있구요...), 이런 것은 곱하기로 하는 경우가 있었던 기억이 있습니다. 나누기가 곱하기보다는 좀 더 비싸다고 알고 있습니다...
Computer Architecture 책을 보시면 확실히 아실수 있을겁니다. ;;
텍스트 포맷에 대한 자세한 정보
<code>
<blockcode>
<apache>
<applescript>
<autoconf>
<awk>
<bash>
<c>
<cpp>
<css>
<diff>
<drupal5>
<drupal6>
<gdb>
<html>
<html5>
<java>
<javascript>
<ldif>
<lua>
<make>
<mysql>
<perl>
<perl6>
<php>
<pgsql>
<proftpd>
<python>
<reg>
<spec>
<ruby>
<foo>
[foo]
CPU가 내부적으로 어떻게 하는지 저도 모르지만 이런 곱셈방법이 있습니다
CPU가 내부적으로 어떻게 하는지 저도 모르지만 이런 곱셈방법이 있습니다.
예를 들어서 x값에 5를 곱한다고 하죠.
5를 이진수로 0101b 가 되겠군요.
여기서 1을 하나씩만 취해서 각각 이진수로 나열하면
0100b, 0001b
첫번째수 은 1이 왼쪽으로 :!: 2번, 두번째 수는 :!: 0번이군요.
이렇게 나오죠? 이제 곱셈이 아닌 쉬프트만으로 이를 계산할수 있게 됩니다.
(x << :!: 2) + (x << :!: 0) = "x * 5 를 한 결과와 같은 수"
이렇게 되죠.
검산해볼까요?
x를 4라고 합시다.
(4 * 5) = (4 << 2) + (4 << 0) = 16 + 4 = 20.
맞죠? 곱셈보다 쉬프트가 빠르다는 이유 하나만으로 이것은
유용한 계산법이 되겠네요.
나누기는 쉬프트 반전해서 하는거 뻔하고... 나머지는 AND하면 되는거고...
아마도 CPU logic은 피연산자를 rol해가면서 비트 1을 만나면 이처럼
계산할지도 모른다는 생각을 저는 굳게 믿고 있습니다.
[code:1]leal (%eax,%eax,4),%ebx[
leal (%eax,%eax,4),%ebx
이렇게 하면 %ebx = %eax *5가 됩니다. 실제로는 %ebx = %eax + %eax * 4지만요. leal 명령은 1 클럭 싸이클에 불과하므로 간단한 홀수 곱셈을 매우 빠르게 할 수 있습니다.[quote="minzkn"]나누기는 쉬프트 반전해서 하는거 뻔하고.
위에 곱하기는 정말 신기하게도 되는군요..^__________^;
나누기도 간단하게 서식을 써줄수 없나요??
위 말을 제가 이해를 잘 못하겠어요....^_^
꼬리: 좋은 내용 감사합니다.^^;
.
마음을 가꾸는 방법은??
곱하기는 있는데 나누기 없는 CPU도 있는데 (곱하기 없는 것도 있구요.
곱하기는 있는데 나누기 없는 CPU도 있는데 (곱하기 없는 것도 있구요...), 이런 것은 곱하기로 하는 경우가 있었던 기억이 있습니다. 나누기가 곱하기보다는 좀 더 비싸다고 알고 있습니다...
Computer Architecture 책을 보시면 확실히 아실수 있을겁
Computer Architecture 책을 보시면 확실히 아실수 있을겁니다. ;;
댓글 달기