X-Git-Url: https://git.ucc.asn.au/?p=ipdf%2Fcode.git;a=blobdiff_plain;f=src%2Farbint.cpp;fp=src%2Farbint.cpp;h=ccde0dd75f54363d90c4e1a0e9ad104fbdc6402a;hp=0000000000000000000000000000000000000000;hb=33356addacfe4296ecb613c6c4696f082e351159;hpb=54798ed9050d0742c6cdab067fad0cc364b1d6b2 diff --git a/src/arbint.cpp b/src/arbint.cpp new file mode 100644 index 0000000..ccde0dd --- /dev/null +++ b/src/arbint.cpp @@ -0,0 +1,52 @@ +#include "arbint.h" +#include +#include +using namespace std; + +/* +static bool addc(uint32_t a, uint32_t b, uint32_t * r) +{ + volatile uint32_t carry = false; + volatile uint32_t result = a + b; + asm volatile + ( + "jc 1f;" + "mov $0, %%eax;" + "1:" + : "=a" (carry) + ); + *r = result; + return (carry == 1); +} +*/ + +namespace IPDF +{ + +Arbint::Arbint(int64_t i) : m_words(2), m_sign(false) +{ + m_sign = i < 0; + memcpy(m_words.data(), &i, sizeof(int64_t)); +} + +string Arbint::Str() const +{ + string s(""); + for (unsigned i = 0; i < m_words.size(); ++i) + { + uint32_t w = m_words[i]; + do + { + uint32_t q = w % 10; + w /= 10; + s += ('0' + q); + } + while (w > 0); + if (i+1 < m_words.size()) s += ","; + } + if (m_sign) s += '-'; + reverse(s.begin(), s.end()); + return s; +} + +}