X-Git-Url: https://git.ucc.asn.au/?p=ipdf%2Fcode.git;a=blobdiff_plain;f=src%2Farbint.h;h=5fefa8042d3d380a8c725571d3522d1b5a81c7c1;hp=f1377967b9f2a894ab7127196c3dc0f7579207f3;hb=c99e399282b8e19748ef9fa5d703c3fc32783a2d;hpb=eaebb5a37393bb02c3272d6259d60ce75d197b6f diff --git a/src/arbint.h b/src/arbint.h index f137796..5fefa80 100644 --- a/src/arbint.h +++ b/src/arbint.h @@ -14,18 +14,19 @@ namespace IPDF class Arbint { public: - typedef int64_t digit_t; + typedef uint64_t digit_t; - Arbint(digit_t i); + Arbint(int64_t i); Arbint(const std::vector & digits); Arbint(unsigned n, digit_t d0, ...); Arbint(const std::string & str, const std::string & base="0123456789"); - ~Arbint() {} + virtual ~Arbint() {} Arbint(const Arbint & cpy); - digit_t AsDigit() const + int64_t AsDigit() const { - return (m_sign) ? -m_digits[0] : m_digits[0]; + int64_t digit = (m_digits.size() == 1) ? m_digits[0] : 0x7FFFFFFFFFFFFFFF; + return (m_sign) ? -digit : digit; } inline bool Sign() const {return m_sign;} @@ -44,6 +45,9 @@ namespace IPDF Arbint & operator*=(const Arbint & mul); void Division(const Arbint & div, Arbint & result, Arbint & modulo) const; + Arbint & operator<<=(unsigned amount); + Arbint & operator>>=(unsigned amount); + inline Arbint operator+(const Arbint & add) const { Arbint a(*this); @@ -100,20 +104,40 @@ namespace IPDF inline bool operator>=(const Arbint & leq) const { - return (this->operator==(leq) || this->operator<(leq)); + return (this->operator==(leq) || this->operator>(leq)); } inline bool operator>(const Arbint & grea) const { return !(this->operator<=(grea)); } - + inline Arbint operator>>(unsigned amount) const + { + Arbint result(*this); + result >>= amount; + return result; + } + inline Arbint operator<<(unsigned amount) const + { + Arbint result(*this); + result <<= amount; + return result; + } bool IsZero() const; + //inline operator double() const {return double(AsDigit());} + inline operator int64_t() const {return AsDigit();} + //inline operator int() const {return int(AsDigit());} + unsigned Shrink(); private: Arbint & AddBasic(const Arbint & add); Arbint & SubBasic(const Arbint & sub); + + bool GetBit(unsigned i) const; + void BitClear(unsigned i); + void BitSet(unsigned i); + std::vector m_digits; bool m_sign; @@ -123,10 +147,11 @@ namespace IPDF extern "C" { - typedef int64_t digit_t; + typedef uint64_t digit_t; digit_t add_digits(digit_t * dst, digit_t * add, digit_t size); digit_t sub_digits(digit_t * dst, digit_t * add, digit_t size); digit_t mul_digits(digit_t * dst, digit_t mul, digit_t size); + digit_t div_digits(digit_t * dst, digit_t div, digit_t size, digit_t * rem); } }