15 #pragma region structors 34 const int n = strlen(
string);
62 #pragma endregion structors 67 #pragma region general 79 const uint32_t size = 2*
sizeof(uint32_t);
81 for(
auto i=0; i<size; i++){
82 uint32_t digit = n & 0xF;
83 char c = char(digit + (digit < 10?
'0':
'A' - 10));
91 for(
auto it=std::prev(s.end()); it!=s.begin() && *it==
'0';){
100 std::reverse(s.begin(), s.end());
131 for(i=0; i<oldsize; i++)
143 uintx_t::operator uint32_t(){
150 uintx_t::operator uint64_t(){
151 return (uint64_t(m_pData[1]) << 32) | m_pData[0];
167 for(
int i=0; i<=top; i++)
180 int digitcount = strlen(
string);
188 for(i=0; i<digitcount; i++){
193 if(
string[i] >=
'0' &&
string[i] <=
'9')
194 digit =
string[i] -
'0';
196 else if(
string[i] >=
'A' &&
string[i] <=
'F')
197 digit = 10+
string[i] -
'A';
199 else if(
string[i] >=
'a' &&
string[i] <=
'f')
200 digit = 10 +
string[i]-
'a';
236 #pragma endregion general 241 #pragma region assignment 278 #pragma endregion assignment 283 #pragma region addition 308 uint32_t left, right, left_msb, right_msb;
309 uint32_t sum, sum_msb;
312 const uint32_t mask_msb = 1 << (
BitsInWord-1);
313 const uint32_t mask_lsb = ~mask_msb;
322 left = i < oldsize?
m_pData[i]: 0;
326 left_msb = (left & mask_msb) >> (
BitsInWord - 1);
327 right_msb = (right & mask_msb) >> (
BitsInWord - 1);
330 left = left & mask_lsb;
331 right = right & mask_lsb;
334 sum = left + right + carry;
337 sum_msb = (sum & mask_msb) >> (
BitsInWord - 1);
338 sum = sum & mask_lsb;
339 carry = left_msb + right_msb + sum_msb;
342 if((carry == 1) || (carry == 3))
343 sum = sum | mask_msb;
359 #pragma endregion addition 364 #pragma region comparison 376 for(
int i=x.
m_nSize-1; i>=0; i--)
402 for(
int i=x.
m_nSize-1; i>=0; i--)
465 for(
int i=x.
m_nSize - 1; i>=0; i--)
517 #pragma endregion comparison 553 for(dest=
m_nSize - 1; dest>=0; dest--){
597 for(dest=0; dest<newsize; dest++){
604 for(
int i=newsize; i<
m_nSize; i++)
621 #pragma endregion shift 626 #pragma region bitwise 636 for(
int i=0; i<n; i++)
659 for(
int i=0; i<n; i++)
674 #pragma endregion bitwise 679 #pragma region multiplication 709 for(
int i=0; i<x.
m_nSize; i++){
710 uint64_t prod = (uint64_t)x.
m_pData[i]*(uint64_t)y;
711 word.
m_pData[i] = unsigned(prod & 0xFFFFFFFF);
712 carry.
m_pData[i + 1] = unsigned(prod >> 32);
741 for(
int i=0; i<x.
m_nSize; i++){
742 uint64_t prod = (uint64_t)x.
m_pData[i]*(uint64_t)y;
743 word.
m_pData[i] = unsigned(prod & 0xFFFFFFFF);
744 carry.
m_pData[i + 1] = unsigned(prod >> 32);
767 return *
this = *
this * y;
770 #pragma endregion multiplication 775 #pragma region subtraction 795 uint32_t left, right;
806 borrow = ++right == 0;
820 #pragma endregion subtraction 825 #pragma region division 871 return *
this = *
this/y;
901 return *
this = *
this%y;
913 #pragma endregion division bool operator>(uintx_t x, uintx_t y)
std::string GetString() const
Get as string.
uintx_t operator/(uintx_t y, uintx_t z)
int bitcount()
Number of bits.
uintx_t & operator<<=(const int)
Left shift by.
void grow(const int s)
Grow space for s words.
uintx_t operator-(uintx_t x, uintx_t y)
const int BitsInHalfByte
Number of bits in a nibble.
uintx_t & operator>>=(const int)
Right shift by.
uintx_t & operator *=(const uintx_t &)
Multiply by.
void reallocate(const int s)
Reallocate space for s words.
uintx_t & operator/=(const uintx_t &)
Divide by.
void loadstring(const char *string)
Load hex string.
uintx_t operator+(uintx_t x, uintx_t y)
bool operator!=(uintx_t x, uintx_t y)
bool operator==(uintx_t x, uintx_t y)
bool operator<(uintx_t x, uintx_t y)
uintx_t & operator-=(const uintx_t &)
Subtract from.
Declaration of the extensible unsigned integer class.
uintx_t operator *(uintx_t y, uintx_t z)
bool operator>=(uintx_t x, uintx_t y)
uintx_t operator%(uintx_t y, uintx_t z)
int m_nSize
Number of words in m_pData.
The extensible unsigned integer class.
uintx_t operator &(uintx_t x, const uintx_t &y)
uintx_t operator>>(uintx_t x, int d)
bool operator<=(uintx_t x, uintx_t y)
uintx_t & operator+=(const uintx_t &)
Add to.
const int BitsInWord
Number of bits in a word.
uint32_t * m_pData
Array of 32-bit words, least significant first.
void normalize()
Remove leading zero words.
uintx_t & operator%=(const uintx_t &)
Remainder.
uintx_t operator<<(uintx_t x, int d)
uintx_t & operator=(const uintx_t &)
Assignment.
const int HalfBytesInWord
Number of nibbles in a word.
uintx_t operator|(uintx_t x, const uintx_t &y)