■ 종이와 연필 방법
상기 나눗셈 방법은 피제수로부터 제수에 대한 뺄셈 연산의 반복인데
한 번씩 뺄셈 연산 후의 결과를 부분 나머지(partial remainder)라고 하며 이 부분 나머지가 제수보다 큰 경우엔 뺄셈 과정을 계속 반복하며 적을 경우에 연산이 종료됩니다. 이 과정을 보다 효과적으로 하기 위하여
피제수에서 그냥 제수를 빼지 않고 제수의 ..., 8, 4, 2, ... 배 (2의 승수 배)를 빼 줍니다. 즉, 두 번째 뺄셈과정은 q2 22 V를 피제수로부터 뺄셈 연산을 하는데 이는 제수 V를 네 번 반복하여 뺄셈 연산을 수행하는 것과 동일합니다. 이 과정의 반복으로 부분 나머지가 0 보다 크고 제수보다 적을 때
연산이 종료됩니다. ■ 종이와 연필 방법: 컴퓨터
구현
앞서 살펴본 나눗셈 100110 ÷ 101 (38 ÷ 5 = 7 ...3)을 컴퓨터로 구현할 경우에는
제수의 배수에 대한 뺄셈 연산하기 위하여 제수에 대한 자리 이동을 하지
않고, 반대로 제수는 그대로 둔 채 피제수를 반대 방향으로 자리 이동함으로써
다음과 같이 구현합니다. 제수 V 101 100110
피제수 D = R4
Q =
q3
q2
q1
q0
■ 나눗셈 기본
출처 - KLDP.org /*+-------------------------------------------------------------------------+ [출처] 펌] 비트연산을 이용한 곱셈나눗셈|작성자 OzOn
0111 몫 Q = q3 q2 q1 q0
+---------
제수 V 101 | 100110 피제수 D =
R4
000 q3 23
V
----------
100110
R3
101
q2 22
V
----------
10010
R2
101
q1 21
V
----------
1000
R1
101
q0 20
V
----------
011
R0 = 나머지
000 q3 23 V
0
----------
100110
R3
1001100 2 x
R3
101 q2 23 V
01
----------
10010
R2
100100 2
x R2
101
q1 23 V
011
----------
10000 R1
100000 2 x
R1
101 q0 23 V
0111
----------
011000
R0 = 23
R
나머지 = 011
몫 = 0111
-
피제수(dividend): D
-
제수(divisor): V
-
몫(quotient): Q = qn-1 qn-2 ...
q1
q0
-
나머지(remainder): R
- D = Q x V + R
- 0 ≤
R < V
D = qn-1 2n-1 V +
qn-2 2n-2 V + ... + q0 20 V + R --------------------
(1)
- 주어진 수: D, V
- 주어진 범위: 모든 i 에 대하여 qi = 0
혹은 1
0 ≤ R <
V
만약 D
- 2n-1 V >= 0 이면 qn-1 = 1 이며
D - 2n-1 V = qn-2
2n-2 V + qn-3 2n-3
V + ... + q0 20 V + R --------
(2)
그렇지 않으면 qn-1 = 0 이며
D = qn-2 2n-2 V +
qn-3 2n-3 V + ... + q0 20 V + R ---------------
(3)
| FILE: math.c |
| Version: 0.1 |
| <math.c> |
| Copyright (c) 2003 Chun Joon Sung |
| Email: chunjoonsung@hanmail.net |
+-------------------------------------------------------------------------+*/
long multiply(multiplicand, multiplier)
long multiplicand;
long multiplier;
{
long i=0, sign=0, sum=0;
if( multiplicand & (1<<31) )
{
multiplicand = ~multiplicand + 1;
sign++;
}
if( multiplier & (1<<31) )
{
multiplier = ~multiplier + 1;
sign++;
}
for(i=0, sum=0; i<32; i++)
{
if( (multiplier>>i) & 0x01 )
sum += (multiplicand<<i);
}
if( sign & 0x01 )
{
sum = ~sum + 1;
}
return sum;
}
long divide(dividend, divisor)
long dividend;
long divisor;
{
long i=0, sign=0, div=0, mod\0;
sign = 0;
if( dividend < 0 )
{
dividend = ~dividend + 1;
sign++;
}
if( divisor < 0 )
{
divisor = ~divisor + 1;
sign++;
}
if( dividend < divisor )
{
div = 0;
}
else
{
for(i=0; i<32; i++)
{
if( dividend < (divisor<<i) )
{
if( i > 0 ) i--;
break;
}
else if( dividend == (divisor<<i) )
{
break;
}
}
div = 0;
for(; i>=0; i--)
{
if( dividend < divisor )
break;
if( dividend >= (divisor<<i) )
{
dividend -= (divisor<<i);
div += (1<<i);
}
}
}
if( sign & 0x01 )
{
div = ~div + 1;
}
return div;
}
long mod(dividend, divisor)
long dividend;
long divisor;
{
return (dividend - mul(divisor,div(dividend,divisor)));
}
카테고리 없음
비트 연산을 이용한 곱셈 나눗셈
■ 비트 연산을 이용한 곱셈 나눗셈