40 #ifndef headerfilettmathint 41 #define headerfilettmathint 62 template<u
int value_size>
187 uint CorrectCarryAfterAdding(
bool p1_is_sign,
bool p2_is_sign)
189 if( !p1_is_sign && !p2_is_sign )
195 if( p1_is_sign && p2_is_sign )
222 bool p1_is_sign =
IsSign();
223 bool p2_is_sign = ss2.
IsSign();
227 return CorrectCarryAfterAdding(p1_is_sign, p2_is_sign);
239 bool p1_is_sign =
IsSign();
243 return CorrectCarryAfterAdding(p1_is_sign,
false);
258 bool p1_is_sign =
IsSign();
262 return CorrectCarryAfterAdding(p1_is_sign,
false);
267 uint CorrectCarryAfterSubtracting(
bool p1_is_sign,
bool p2_is_sign)
269 if( !p1_is_sign && p2_is_sign )
275 if( p1_is_sign && !p2_is_sign )
301 bool p1_is_sign =
IsSign();
302 bool p2_is_sign = ss2.
IsSign();
306 return CorrectCarryAfterSubtracting(p1_is_sign, p2_is_sign);
316 bool p1_is_sign =
IsSign();
320 return CorrectCarryAfterSubtracting(p1_is_sign,
false);
329 bool p1_is_sign =
IsSign();
333 return CorrectCarryAfterAdding(p1_is_sign,
false);
342 bool p1_is_sign =
IsSign();
346 return CorrectCarryAfterSubtracting(p1_is_sign,
false);
353 uint CheckMinCarry(
bool ss1_is_sign,
bool ss2_is_sign)
369 if( ss1_is_sign != ss2_is_sign )
400 bool ss1_is_sign, ss2_is_sign;
423 c += CheckMinCarry(ss1_is_sign, ss2_is_sign);
425 if( ss1_is_sign != ss2_is_sign )
442 bool ss1_is_sign, ss2_is_sign;
446 ss2_is_sign = ss2.
IsSign();
457 c += CheckMinCarry(ss1_is_sign, ss2_is_sign);
459 if( ss1_is_sign != ss2_is_sign )
482 bool ss1_is_sign, ss2_is_sign;
485 ss2_is_sign = ss2.
IsSign();
495 if( ss1_is_sign != ss2_is_sign )
498 if( ss1_is_sign && remainder )
499 remainder->SetSign();
506 return Div(ss2, &remainder);
526 bool ss1_is_sign, ss2_is_sign;
548 if( ss1_is_sign != ss2_is_sign )
554 *remainder = -
sint(rem);
556 *remainder =
sint(rem);
565 return DivInt(ss2, &remainder);
589 if( was_sign && (pow.
table[0] & 1) == 1 )
593 return (c==0)? 0 : 1;
622 uint c_temp = t.Pow2(pow);
646 template<u
int argument_size>
649 uint min_size = (value_size < argument_size)? value_size : argument_size;
652 for(i=0 ; i<min_size ; ++i)
656 if( value_size > argument_size )
667 for( ; i<value_size ; ++i)
675 if( UInt_type && test!=0 )
678 for( ; i<argument_size ; ++i)
679 if( p.
table[i] != test )
696 template<u
int argument_size>
699 return FromUIntOrInt(p,
false);
710 for(
uint i=1 ; i<value_size ; ++i)
723 template<u
int argument_size>
726 return FromUIntOrInt(p,
true);
733 template<u
int argument_size>
736 return FromUIntOrInt(p,
true);
745 for(
uint i=1 ; i<value_size ; ++i)
784 template<u
int argument_size>
825 template<u
int argument_size>
839 template<u
int argument_size>
871 template<u
int argument_size>
880 #ifdef TTMATH_PLATFORM32 894 if( value_size == 1 )
897 if( value_size == 2 )
924 if( value_size == 1 )
926 if(
uint(ulint(n) >> 32) != mask )
934 for(
uint i=2 ; i<value_size ; ++i)
989 #ifdef TTMATH_PLATFORM64 1086 #ifndef TTMATH_DONT_USE_WCHAR 1146 if( value_size == 1 )
1175 for(
uint i=1 ; i<value_size ; ++i)
1183 #ifdef TTMATH_PLATFORM32 1194 if( value_size == 1 )
1197 if( value_size == 2 )
1222 if( value_size == 1 )
1239 for(
uint i=2 ; i<value_size ; ++i)
1251 #ifdef TTMATH_PLATFORM64 1289 result = int(first);
1292 if( (first >> 31) != (mask >> 31) )
1295 for(
uint i=1 ; i<value_size ; ++i)
1312 template<
class string_type>
1313 void ToStringBase(string_type & result,
uint b = 10)
const 1319 temp.UInt<value_size>::ToStringBase(result, b,
true);
1334 return ToStringBase(result, b);
1344 ToStringBase(result, b);
1350 #ifndef TTMATH_DONT_USE_WCHAR 1357 return ToStringBase(result, b);
1366 std::wstring result;
1367 ToStringBase(result, b);
1381 template<
class char_type>
1382 uint FromStringBase(
const char_type * s,
uint b = 10,
const char_type ** after_source = 0,
bool * value_read = 0)
1384 bool is_sign =
false;
1386 Misc::SkipWhiteCharacters(s);
1391 Misc::SkipWhiteCharacters(++s);
1396 Misc::SkipWhiteCharacters(++s);
1455 return FromStringBase(s, b, after_source, value_read);
1462 uint FromString(
const wchar_t * s,
uint b = 10,
const wchar_t ** after_source = 0,
bool * value_read = 0)
1464 return FromStringBase(s, b, after_source, value_read);
1489 #ifndef TTMATH_DONT_USE_WCHAR 1555 bool operator<(const Int<value_size> & l)
const 1557 sint i=value_size-1;
1566 for(--i ; i>=0 ; --i)
1580 sint i=value_size-1;
1589 for(--i ; i>=0 ; --i)
1601 bool operator<=(const Int<value_size> & l)
const 1603 sint i=value_size-1;
1612 for(--i ; i>=0 ; --i)
1626 sint i=value_size-1;
1635 for(--i ; i>=0 ; --i)
1747 temp.
Div(p2, remainder);
1818 template<
class ostream_type,
class string_type>
1819 static ostream_type & OutputToStream(ostream_type & s,
const Int<value_size> & l)
1837 friend std::ostream & operator<<(std::ostream & s, const Int<value_size> & l)
1839 return OutputToStream<std::ostream, std::string>(s, l);
1843 #ifndef TTMATH_DONT_USE_WCHAR 1848 friend std::wostream & operator<<(std::wostream & s, const Int<value_size> & l)
1850 return OutputToStream<std::wostream, std::wstring>(s, l);
1862 template<
class istream_type,
class string_type,
class char_type>
1863 static istream_type & InputFromStream(istream_type & s,
Int<value_size> & l)
1873 if( z==
'-' || z==
'+' )
1883 z =
static_cast<char_type
>(s.get());
1903 return InputFromStream<std::istream, std::string, char>(s, l);
1907 #ifndef TTMATH_DONT_USE_WCHAR 1914 return InputFromStream<std::wistream, std::wstring, wchar_t>(s, l);
Int< value_size > & operator=(const Int< argument_size > &p)
Int implements a big integer value with a sign.
std::string ToString(uint b=10) const
Int< value_size > & operator=(const std::string &s)
uint SubInt(uint value, uint index=0)
Int< value_size > & operator=(const Int< value_size > &p)
uint ToUInt(unsigned int &result) const
friend std::istream & operator>>(std::istream &s, Int< value_size > &l)
static uint CharToDigit(uint c)
uint FromUInt(const UInt< argument_size > &p)
Int< value_size > & operator=(unsigned int i)
uint AddInt(uint value, uint index=0)
uint Pow(Int< value_size > pow)
uint FromString(const wchar_t *s, uint b=10, const wchar_t **after_source=0, bool *value_read=0)
template class UInt<uint>
uint ToInt(sint &result) const
std::wstring ToWString(uint b=10) const
uint FromInt(const Int< argument_size > &p)
Int(const Int< value_size > &u)
uint Sub(const UInt< value_size > &ss2, uint c=0)
uint FromInt(unsigned int i)
uint Add(const UInt< value_size > &ss2, uint c=0)
Int(const std::wstring &s)
bool operator==(const Int< value_size > &l) const
bool IsTheHighestBitSet() const
friend std::wistream & operator>>(std::wistream &s, Int< value_size > &l)
uint FromUInt(uint value)
uint FromString(const std::wstring &s, uint b=10)
uint FromInt(const UInt< argument_size > &p)
uint FromUInt(const UInt< argument_size > &p)
#define TTMATH_UINT_HIGHEST_BIT
a namespace for the TTMath library
uint ToInt(unsigned int &result) const
void ToString(std::string &result, uint b=10) const
uint ToUInt(uint &result) const
uint Div(const UInt< value_size > &divisor, UInt< value_size > *remainder=0, uint algorithm=3)
#define TTMATH_UINT_MAX_VALUE
uint FromUInt(unsigned int i)
Int(const std::string &s)
uint Pow(UInt< value_size > pow)
uint ToInt(uint &result) const
UInt< value_size > & operator++()
Int< value_size > operator-() const
void ToString(std::wstring &result, uint b=10) const
uint AddTwoInts(uint x2, uint x1, uint index)
uint Mul(Int< value_size > ss2)
Int< value_size > & operator=(uint i)
uint Add(const Int< value_size > &ss2)
uint AddInt(uint value, uint index=0)
uint FromString(const std::string &s, uint b=10)
#define TTMATH_BITS_PER_UINT
UInt implements a big integer value without a sign.
void ToStringBase(string_type &result, uint b=10, bool negative=false) const
uint AddTwoInts(uint x2, uint x1, uint index)
uint FromInt(signed int i)
uint FromString(const char *s, uint b=10, const char **after_source=0, bool *value_read=0)
UInt< value_size > operator++(int)
Int< value_size > & operator=(const wchar_t *s)
Int< value_size > & operator=(const UInt< argument_size > &p)
Int< value_size > & operator=(const char *s)
uint DivInt(sint ss2, sint *remainder=0)
uint Div(Int< value_size > ss2, Int< value_size > *remainder=0)
Int< value_size > & operator=(signed int i)
uint Mul(const UInt< value_size > &ss2, uint algorithm=100)
uint ToInt(int &result) const
Int(const UInt< argument_size > &u)
Int< value_size > & operator=(sint i)
uint DivInt(uint divisor, uint *remainder=0)
uint SubInt(uint value, uint index=0)
Int(const Int< argument_size > &u)
Int< value_size > & operator=(const std::wstring &s)
uint Sub(const Int< value_size > &ss2)