git.ucc.asn.au
/
ipdf
/
code.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
| inline |
side by side
digit_t is now unsigned, asm division for 1 digit
[ipdf/code.git]
/
src
/
arbint.cpp
diff --git
a/src/arbint.cpp
b/src/arbint.cpp
index
59e2252
..
696dcd0
100644
(file)
--- a/
src/arbint.cpp
+++ b/
src/arbint.cpp
@@
-114,6
+114,18
@@
void Arbint::Division(const Arbint & div, Arbint & result, Arbint & remainder) c
{
remainder = 0;
result = 0;
+ if (div.IsZero())
+ {
+ result = *this;
+ return;
+ }
+ else if (div.m_digits.size() == 1)
+ {
+ result.m_digits.resize(m_digits.size(), 0L);
+ remainder = Arbint(div_digits((digit_t*)&m_digits[0], div.m_digits[0], m_digits.size(), result.m_digits.data()));
+ result.m_sign = !(m_sign == div.m_sign);
+ return;
+ }
for (int i = 8*sizeof(digit_t)*m_digits.size(); i >= 0; --i)
{
remainder <<= 1;
@@
-127,6
+139,7
@@
void Arbint::Division(const Arbint & div, Arbint & result, Arbint & remainder) c
result.BitSet(i);
}
}
+ result.m_sign = !(m_sign == div.m_sign);
}
Arbint & Arbint::operator+=(const Arbint & add)
@@
-190,7
+203,7
@@
Arbint & Arbint::SubBasic(const Arbint & sub)
{
m_sign = !m_sign;
for (unsigned i = 0; i < m_digits.size(); ++i)
- m_digits[i] =
-m_digits[i]
;
+ m_digits[i] =
(~m_digits[i]) + 1
;
}
return *this;
}
@@
-265,7
+278,7
@@
Arbint & Arbint::operator>>=(unsigned amount)
if (whole >= old_size)
{
- m_digits.resize(1);
+ m_digits.resize(1
,0L
);
m_digits[0] = 0L;
return *this;
}
UCC
git Repository :: git.ucc.asn.au