genesis                 1 
genesis                 2 
genesis                 3 
genesis                 4 
genesis                 5 #ifndef BITCOIN_UINT256_H
genesis                 6 #define BITCOIN_UINT256_H
genesis                 7 
genesis                 8 #include "serialize.h"
genesis                 9 
genesis                10 #include <limits.h>
genesis                11 #include <string>
genesis                12 #include <vector>
genesis                13 
genesis                14 #if defined(_MSC_VER) || defined(__BORLANDC__)
genesis                15 typedef __int64  int64;
genesis                16 typedef unsigned __int64  uint64;
genesis                17 #else
genesis                18 typedef long long  int64;
genesis                19 typedef unsigned long long  uint64;
genesis                20 #endif
genesis                21 #if defined(_MSC_VER) && _MSC_VER < 1300
genesis                22 #define for  if (false) ; else for
genesis                23 #endif
genesis                24 
genesis                25 
genesis                26 inline int Testuint256AdHoc(std::vector<std::string> vArg);
genesis                27 
genesis                28 
genesis                29 
genesis                30 
genesis                31 
genesis                32 template<unsigned int BITS>
genesis                33 class base_uint
genesis                34 {
genesis                35 protected:
genesis                36     enum { WIDTH=BITS/32 };
genesis                37     unsigned int pn[WIDTH];
genesis                38 public:
genesis                39 
genesis                40     bool operator!() const
genesis                41     {
genesis                42         for (int i = 0; i < WIDTH; i++)
genesis                43             if (pn[i] != 0)
genesis                44                 return false;
genesis                45         return true;
genesis                46     }
genesis                47 
genesis                48     const base_uint operator~() const
genesis                49     {
genesis                50         base_uint ret;
genesis                51         for (int i = 0; i < WIDTH; i++)
genesis                52             ret.pn[i] = ~pn[i];
genesis                53         return ret;
genesis                54     }
genesis                55 
genesis                56     const base_uint operator-() const
genesis                57     {
genesis                58         base_uint ret;
genesis                59         for (int i = 0; i < WIDTH; i++)
genesis                60             ret.pn[i] = ~pn[i];
genesis                61         ret++;
genesis                62         return ret;
genesis                63     }
genesis                64 
genesis                65 
genesis                66     base_uint& operator=(uint64 b)
genesis                67     {
genesis                68         pn[0] = (unsigned int)b;
genesis                69         pn[1] = (unsigned int)(b >> 32);
genesis                70         for (int i = 2; i < WIDTH; i++)
genesis                71             pn[i] = 0;
genesis                72         return *this;
genesis                73     }
genesis                74 
genesis                75     base_uint& operator^=(const base_uint& b)
genesis                76     {
genesis                77         for (int i = 0; i < WIDTH; i++)
genesis                78             pn[i] ^= b.pn[i];
genesis                79         return *this;
genesis                80     }
genesis                81 
genesis                82     base_uint& operator&=(const base_uint& b)
genesis                83     {
genesis                84         for (int i = 0; i < WIDTH; i++)
genesis                85             pn[i] &= b.pn[i];
genesis                86         return *this;
genesis                87     }
genesis                88 
genesis                89     base_uint& operator|=(const base_uint& b)
genesis                90     {
genesis                91         for (int i = 0; i < WIDTH; i++)
genesis                92             pn[i] |= b.pn[i];
genesis                93         return *this;
genesis                94     }
genesis                95 
genesis                96     base_uint& operator^=(uint64 b)
genesis                97     {
genesis                98         pn[0] ^= (unsigned int)b;
genesis                99         pn[1] ^= (unsigned int)(b >> 32);
genesis               100         return *this;
genesis               101     }
genesis               102 
genesis               103     base_uint& operator|=(uint64 b)
genesis               104     {
genesis               105         pn[0] |= (unsigned int)b;
genesis               106         pn[1] |= (unsigned int)(b >> 32);
genesis               107         return *this;
genesis               108     }
genesis               109 
genesis               110     base_uint& operator<<=(unsigned int shift)
genesis               111     {
genesis               112         base_uint a(*this);
genesis               113         for (int i = 0; i < WIDTH; i++)
genesis               114             pn[i] = 0;
genesis               115         int k = shift / 32;
genesis               116         shift = shift % 32;
genesis               117         for (int i = 0; i < WIDTH; i++)
genesis               118         {
genesis               119             if (i+k+1 < WIDTH && shift != 0)
genesis               120                 pn[i+k+1] |= (a.pn[i] >> (32-shift));
genesis               121             if (i+k < WIDTH)
genesis               122                 pn[i+k] |= (a.pn[i] << shift);
genesis               123         }
genesis               124         return *this;
genesis               125     }
genesis               126 
genesis               127     base_uint& operator>>=(unsigned int shift)
genesis               128     {
genesis               129         base_uint a(*this);
genesis               130         for (int i = 0; i < WIDTH; i++)
genesis               131             pn[i] = 0;
genesis               132         int k = shift / 32;
genesis               133         shift = shift % 32;
genesis               134         for (int i = 0; i < WIDTH; i++)
genesis               135         {
genesis               136             if (i-k-1 >= 0 && shift != 0)
genesis               137                 pn[i-k-1] |= (a.pn[i] << (32-shift));
genesis               138             if (i-k >= 0)
genesis               139                 pn[i-k] |= (a.pn[i] >> shift);
genesis               140         }
genesis               141         return *this;
genesis               142     }
genesis               143 
genesis               144     base_uint& operator+=(const base_uint& b)
genesis               145     {
genesis               146         uint64 carry = 0;
genesis               147         for (int i = 0; i < WIDTH; i++)
genesis               148         {
genesis               149             uint64 n = carry + pn[i] + b.pn[i];
genesis               150             pn[i] = n & 0xffffffff;
genesis               151             carry = n >> 32;
genesis               152         }
genesis               153         return *this;
genesis               154     }
genesis               155 
genesis               156     base_uint& operator-=(const base_uint& b)
genesis               157     {
genesis               158         *this += -b;
genesis               159         return *this;
genesis               160     }
genesis               161 
genesis               162     base_uint& operator+=(uint64 b64)
genesis               163     {
genesis               164         base_uint b;
genesis               165         b = b64;
genesis               166         *this += b;
genesis               167         return *this;
genesis               168     }
genesis               169 
genesis               170     base_uint& operator-=(uint64 b64)
genesis               171     {
genesis               172         base_uint b;
genesis               173         b = b64;
genesis               174         *this += -b;
genesis               175         return *this;
genesis               176     }
genesis               177 
genesis               178 
genesis               179     base_uint& operator++()
genesis               180     {
genesis               181         
genesis               182         int i = 0;
genesis               183         while (++pn[i] == 0 && i < WIDTH-1)
genesis               184             i++;
genesis               185         return *this;
genesis               186     }
genesis               187 
genesis               188     const base_uint operator++(int)
genesis               189     {
genesis               190         
genesis               191         const base_uint ret = *this;
genesis               192         ++(*this);
genesis               193         return ret;
genesis               194     }
genesis               195 
genesis               196     base_uint& operator--()
genesis               197     {
genesis               198         
genesis               199         int i = 0;
genesis               200         while (--pn[i] == -1 && i < WIDTH-1)
genesis               201             i++;
genesis               202         return *this;
genesis               203     }
genesis               204 
genesis               205     const base_uint operator--(int)
genesis               206     {
genesis               207         
genesis               208         const base_uint ret = *this;
genesis               209         --(*this);
genesis               210         return ret;
genesis               211     }
genesis               212 
genesis               213 
genesis               214     friend inline bool operator<(const base_uint& a, const base_uint& b)
genesis               215     {
genesis               216         for (int i = base_uint::WIDTH-1; i >= 0; i--)
genesis               217         {
genesis               218             if (a.pn[i] < b.pn[i])
genesis               219                 return true;
genesis               220             else if (a.pn[i] > b.pn[i])
genesis               221                 return false;
genesis               222         }
genesis               223         return false;
genesis               224     }
genesis               225 
genesis               226     friend inline bool operator<=(const base_uint& a, const base_uint& b)
genesis               227     {
genesis               228         for (int i = base_uint::WIDTH-1; i >= 0; i--)
genesis               229         {
genesis               230             if (a.pn[i] < b.pn[i])
genesis               231                 return true;
genesis               232             else if (a.pn[i] > b.pn[i])
genesis               233                 return false;
genesis               234         }
genesis               235         return true;
genesis               236     }
genesis               237 
genesis               238     friend inline bool operator>(const base_uint& a, const base_uint& b)
genesis               239     {
genesis               240         for (int i = base_uint::WIDTH-1; i >= 0; i--)
genesis               241         {
genesis               242             if (a.pn[i] > b.pn[i])
genesis               243                 return true;
genesis               244             else if (a.pn[i] < b.pn[i])
genesis               245                 return false;
genesis               246         }
genesis               247         return false;
genesis               248     }
genesis               249 
genesis               250     friend inline bool operator>=(const base_uint& a, const base_uint& b)
genesis               251     {
genesis               252         for (int i = base_uint::WIDTH-1; i >= 0; i--)
genesis               253         {
genesis               254             if (a.pn[i] > b.pn[i])
genesis               255                 return true;
genesis               256             else if (a.pn[i] < b.pn[i])
genesis               257                 return false;
genesis               258         }
genesis               259         return true;
genesis               260     }
genesis               261 
genesis               262     friend inline bool operator==(const base_uint& a, const base_uint& b)
genesis               263     {
genesis               264         for (int i = 0; i < base_uint::WIDTH; i++)
genesis               265             if (a.pn[i] != b.pn[i])
genesis               266                 return false;
genesis               267         return true;
genesis               268     }
genesis               269 
genesis               270     friend inline bool operator==(const base_uint& a, uint64 b)
genesis               271     {
genesis               272         if (a.pn[0] != (unsigned int)b)
genesis               273             return false;
genesis               274         if (a.pn[1] != (unsigned int)(b >> 32))
genesis               275             return false;
genesis               276         for (int i = 2; i < base_uint::WIDTH; i++)
genesis               277             if (a.pn[i] != 0)
genesis               278                 return false;
genesis               279         return true;
genesis               280     }
genesis               281 
genesis               282     friend inline bool operator!=(const base_uint& a, const base_uint& b)
genesis               283     {
genesis               284         return (!(a == b));
genesis               285     }
genesis               286 
genesis               287     friend inline bool operator!=(const base_uint& a, uint64 b)
genesis               288     {
genesis               289         return (!(a == b));
genesis               290     }
genesis               291 
genesis               292 
genesis               293 
genesis               294     std::string GetHex() const
genesis               295     {
genesis               296         char psz[sizeof(pn)*2 + 1];
genesis               297         for (int i = 0; i < sizeof(pn); i++)
genesis               298             sprintf(psz + i*2, "%02x", ((unsigned char*)pn)[sizeof(pn) - i - 1]);
genesis               299         return std::string(psz, psz + sizeof(pn)*2);
genesis               300     }
genesis               301 
genesis               302     void SetHex(const char* psz)
genesis               303     {
genesis               304         for (int i = 0; i < WIDTH; i++)
genesis               305             pn[i] = 0;
genesis               306 
genesis               307         
genesis               308         while (isspace(*psz))
genesis               309             psz++;
genesis               310 
genesis               311         
genesis               312         if (psz[0] == '0' && tolower(psz[1]) == 'x')
genesis               313             psz += 2;
genesis               314 
genesis               315         
genesis               316         static char phexdigit[256] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0, 0,0xa,0xb,0xc,0xd,0xe,0xf,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0xa,0xb,0xc,0xd,0xe,0xf,0,0,0,0,0,0,0,0,0 };
genesis               317         const char* pbegin = psz;
genesis               318         while (phexdigit[*psz] || *psz == '0')
genesis               319             psz++;
genesis               320         psz--;
genesis               321         unsigned char* p1 = (unsigned char*)pn;
genesis               322         unsigned char* pend = p1 + WIDTH * 4;
genesis               323         while (psz >= pbegin && p1 < pend)
genesis               324         {
genesis               325             *p1 = phexdigit[(unsigned char)*psz--];
genesis               326             if (psz >= pbegin)
genesis               327             {
genesis               328                 *p1 |= (phexdigit[(unsigned char)*psz--] << 4);
genesis               329                 p1++;
genesis               330             }
genesis               331         }
genesis               332     }
genesis               333 
genesis               334     void SetHex(const std::string& str)
genesis               335     {
genesis               336         SetHex(str.c_str());
genesis               337     }
genesis               338 
genesis               339     std::string ToString() const
genesis               340     {
genesis               341         return (GetHex());
genesis               342     }
genesis               343 
genesis               344     unsigned char* begin()
genesis               345     {
genesis               346         return (unsigned char*)&pn[0];
genesis               347     }
genesis               348 
genesis               349     unsigned char* end()
genesis               350     {
genesis               351         return (unsigned char*)&pn[WIDTH];
genesis               352     }
genesis               353 
genesis               354     unsigned int size()
genesis               355     {
genesis               356         return sizeof(pn);
genesis               357     }
genesis               358 
genesis               359 
genesis               360     unsigned int GetSerializeSize(int nType=0, int nVersion=VERSION) const
genesis               361     {
genesis               362         return sizeof(pn);
genesis               363     }
genesis               364 
genesis               365     template<typename Stream>
genesis               366     void Serialize(Stream& s, int nType=0, int nVersion=VERSION) const
genesis               367     {
genesis               368         s.write((char*)pn, sizeof(pn));
genesis               369     }
genesis               370 
genesis               371     template<typename Stream>
genesis               372     void Unserialize(Stream& s, int nType=0, int nVersion=VERSION)
genesis               373     {
genesis               374         s.read((char*)pn, sizeof(pn));
genesis               375     }
genesis               376 
genesis               377 
genesis               378     friend class uint160;
genesis               379     friend class uint256;
genesis               380     friend inline int Testuint256AdHoc(std::vector<std::string> vArg);
genesis               381 };
genesis               382 
genesis               383 typedef base_uint<160> base_uint160;
genesis               384 typedef base_uint<256> base_uint256;
genesis               385 
genesis               386 
genesis               387 
genesis               388 
genesis               389 
genesis               390 
genesis               391 
genesis               392 
genesis               393 
genesis               394 
genesis               395 
genesis               396 
genesis               397 
genesis               398 
genesis               399 
genesis               400 class uint160 : public base_uint160
genesis               401 {
genesis               402 public:
genesis               403     typedef base_uint160 basetype;
genesis               404 
genesis               405     uint160()
genesis               406     {
genesis               407         for (int i = 0; i < WIDTH; i++)
genesis               408             pn[i] = 0;
genesis               409     }
genesis               410 
genesis               411     uint160(const basetype& b)
genesis               412     {
genesis               413         for (int i = 0; i < WIDTH; i++)
genesis               414             pn[i] = b.pn[i];
genesis               415     }
genesis               416 
genesis               417     uint160& operator=(const basetype& b)
genesis               418     {
genesis               419         for (int i = 0; i < WIDTH; i++)
genesis               420             pn[i] = b.pn[i];
genesis               421         return *this;
genesis               422     }
genesis               423 
genesis               424     uint160(uint64 b)
genesis               425     {
genesis               426         pn[0] = (unsigned int)b;
genesis               427         pn[1] = (unsigned int)(b >> 32);
genesis               428         for (int i = 2; i < WIDTH; i++)
genesis               429             pn[i] = 0;
genesis               430     }
genesis               431 
genesis               432     uint160& operator=(uint64 b)
genesis               433     {
genesis               434         pn[0] = (unsigned int)b;
genesis               435         pn[1] = (unsigned int)(b >> 32);
genesis               436         for (int i = 2; i < WIDTH; i++)
genesis               437             pn[i] = 0;
genesis               438         return *this;
genesis               439     }
genesis               440 
genesis               441     explicit uint160(const std::string& str)
genesis               442     {
genesis               443         SetHex(str);
genesis               444     }
genesis               445 
genesis               446     explicit uint160(const std::vector<unsigned char>& vch)
genesis               447     {
genesis               448         if (vch.size() == sizeof(pn))
genesis               449             memcpy(pn, &vch[0], sizeof(pn));
genesis               450         else
genesis               451             *this = 0;
genesis               452     }
genesis               453 };
genesis               454 
genesis               455 inline bool operator==(const uint160& a, uint64 b)                           { return (base_uint160)a == b; }
genesis               456 inline bool operator!=(const uint160& a, uint64 b)                           { return (base_uint160)a != b; }
genesis               457 inline const uint160 operator<<(const base_uint160& a, unsigned int shift)   { return uint160(a) <<= shift; }
genesis               458 inline const uint160 operator>>(const base_uint160& a, unsigned int shift)   { return uint160(a) >>= shift; }
genesis               459 inline const uint160 operator<<(const uint160& a, unsigned int shift)        { return uint160(a) <<= shift; }
genesis               460 inline const uint160 operator>>(const uint160& a, unsigned int shift)        { return uint160(a) >>= shift; }
genesis               461 
genesis               462 inline const uint160 operator^(const base_uint160& a, const base_uint160& b) { return uint160(a) ^= b; }
genesis               463 inline const uint160 operator&(const base_uint160& a, const base_uint160& b) { return uint160(a) &= b; }
genesis               464 inline const uint160 operator|(const base_uint160& a, const base_uint160& b) { return uint160(a) |= b; }
genesis               465 inline const uint160 operator+(const base_uint160& a, const base_uint160& b) { return uint160(a) += b; }
genesis               466 inline const uint160 operator-(const base_uint160& a, const base_uint160& b) { return uint160(a) -= b; }
genesis               467 
genesis               468 inline bool operator<(const base_uint160& a, const uint160& b)          { return (base_uint160)a <  (base_uint160)b; }
genesis               469 inline bool operator<=(const base_uint160& a, const uint160& b)         { return (base_uint160)a <= (base_uint160)b; }
genesis               470 inline bool operator>(const base_uint160& a, const uint160& b)          { return (base_uint160)a >  (base_uint160)b; }
genesis               471 inline bool operator>=(const base_uint160& a, const uint160& b)         { return (base_uint160)a >= (base_uint160)b; }
genesis               472 inline bool operator==(const base_uint160& a, const uint160& b)         { return (base_uint160)a == (base_uint160)b; }
genesis               473 inline bool operator!=(const base_uint160& a, const uint160& b)         { return (base_uint160)a != (base_uint160)b; }
genesis               474 inline const uint160 operator^(const base_uint160& a, const uint160& b) { return (base_uint160)a ^  (base_uint160)b; }
genesis               475 inline const uint160 operator&(const base_uint160& a, const uint160& b) { return (base_uint160)a &  (base_uint160)b; }
genesis               476 inline const uint160 operator|(const base_uint160& a, const uint160& b) { return (base_uint160)a |  (base_uint160)b; }
genesis               477 inline const uint160 operator+(const base_uint160& a, const uint160& b) { return (base_uint160)a +  (base_uint160)b; }
genesis               478 inline const uint160 operator-(const base_uint160& a, const uint160& b) { return (base_uint160)a -  (base_uint160)b; }
genesis               479 
genesis               480 inline bool operator<(const uint160& a, const base_uint160& b)          { return (base_uint160)a <  (base_uint160)b; }
genesis               481 inline bool operator<=(const uint160& a, const base_uint160& b)         { return (base_uint160)a <= (base_uint160)b; }
genesis               482 inline bool operator>(const uint160& a, const base_uint160& b)          { return (base_uint160)a >  (base_uint160)b; }
genesis               483 inline bool operator>=(const uint160& a, const base_uint160& b)         { return (base_uint160)a >= (base_uint160)b; }
genesis               484 inline bool operator==(const uint160& a, const base_uint160& b)         { return (base_uint160)a == (base_uint160)b; }
genesis               485 inline bool operator!=(const uint160& a, const base_uint160& b)         { return (base_uint160)a != (base_uint160)b; }
genesis               486 inline const uint160 operator^(const uint160& a, const base_uint160& b) { return (base_uint160)a ^  (base_uint160)b; }
genesis               487 inline const uint160 operator&(const uint160& a, const base_uint160& b) { return (base_uint160)a &  (base_uint160)b; }
genesis               488 inline const uint160 operator|(const uint160& a, const base_uint160& b) { return (base_uint160)a |  (base_uint160)b; }
genesis               489 inline const uint160 operator+(const uint160& a, const base_uint160& b) { return (base_uint160)a +  (base_uint160)b; }
genesis               490 inline const uint160 operator-(const uint160& a, const base_uint160& b) { return (base_uint160)a -  (base_uint160)b; }
genesis               491 
genesis               492 inline bool operator<(const uint160& a, const uint160& b)               { return (base_uint160)a <  (base_uint160)b; }
genesis               493 inline bool operator<=(const uint160& a, const uint160& b)              { return (base_uint160)a <= (base_uint160)b; }
genesis               494 inline bool operator>(const uint160& a, const uint160& b)               { return (base_uint160)a >  (base_uint160)b; }
genesis               495 inline bool operator>=(const uint160& a, const uint160& b)              { return (base_uint160)a >= (base_uint160)b; }
genesis               496 inline bool operator==(const uint160& a, const uint160& b)              { return (base_uint160)a == (base_uint160)b; }
genesis               497 inline bool operator!=(const uint160& a, const uint160& b)              { return (base_uint160)a != (base_uint160)b; }
genesis               498 inline const uint160 operator^(const uint160& a, const uint160& b)      { return (base_uint160)a ^  (base_uint160)b; }
genesis               499 inline const uint160 operator&(const uint160& a, const uint160& b)      { return (base_uint160)a &  (base_uint160)b; }
genesis               500 inline const uint160 operator|(const uint160& a, const uint160& b)      { return (base_uint160)a |  (base_uint160)b; }
genesis               501 inline const uint160 operator+(const uint160& a, const uint160& b)      { return (base_uint160)a +  (base_uint160)b; }
genesis               502 inline const uint160 operator-(const uint160& a, const uint160& b)      { return (base_uint160)a -  (base_uint160)b; }
genesis               503 
genesis               504 
genesis               505 
genesis               506 
genesis               507 
genesis               508 
genesis               509 
genesis               510 
genesis               511 
genesis               512 
genesis               513 
genesis               514 class uint256 : public base_uint256
genesis               515 {
genesis               516 public:
genesis               517     typedef base_uint256 basetype;
genesis               518 
genesis               519     uint256()
genesis               520     {
genesis               521         for (int i = 0; i < WIDTH; i++)
genesis               522             pn[i] = 0;
genesis               523     }
genesis               524 
genesis               525     uint256(const basetype& b)
genesis               526     {
genesis               527         for (int i = 0; i < WIDTH; i++)
genesis               528             pn[i] = b.pn[i];
genesis               529     }
genesis               530 
genesis               531     uint256& operator=(const basetype& b)
genesis               532     {
genesis               533         for (int i = 0; i < WIDTH; i++)
genesis               534             pn[i] = b.pn[i];
genesis               535         return *this;
genesis               536     }
genesis               537 
genesis               538     uint256(uint64 b)
genesis               539     {
genesis               540         pn[0] = (unsigned int)b;
genesis               541         pn[1] = (unsigned int)(b >> 32);
genesis               542         for (int i = 2; i < WIDTH; i++)
genesis               543             pn[i] = 0;
genesis               544     }
genesis               545 
genesis               546     uint256& operator=(uint64 b)
genesis               547     {
genesis               548         pn[0] = (unsigned int)b;
genesis               549         pn[1] = (unsigned int)(b >> 32);
genesis               550         for (int i = 2; i < WIDTH; i++)
genesis               551             pn[i] = 0;
genesis               552         return *this;
genesis               553     }
genesis               554 
genesis               555     explicit uint256(const std::string& str)
genesis               556     {
genesis               557         SetHex(str);
genesis               558     }
genesis               559 
genesis               560     explicit uint256(const std::vector<unsigned char>& vch)
genesis               561     {
genesis               562         if (vch.size() == sizeof(pn))
genesis               563             memcpy(pn, &vch[0], sizeof(pn));
genesis               564         else
genesis               565             *this = 0;
genesis               566     }
genesis               567 };
genesis               568 
genesis               569 inline bool operator==(const uint256& a, uint64 b)                           { return (base_uint256)a == b; }
genesis               570 inline bool operator!=(const uint256& a, uint64 b)                           { return (base_uint256)a != b; }
genesis               571 inline const uint256 operator<<(const base_uint256& a, unsigned int shift)   { return uint256(a) <<= shift; }
genesis               572 inline const uint256 operator>>(const base_uint256& a, unsigned int shift)   { return uint256(a) >>= shift; }
genesis               573 inline const uint256 operator<<(const uint256& a, unsigned int shift)        { return uint256(a) <<= shift; }
genesis               574 inline const uint256 operator>>(const uint256& a, unsigned int shift)        { return uint256(a) >>= shift; }
genesis               575 
genesis               576 inline const uint256 operator^(const base_uint256& a, const base_uint256& b) { return uint256(a) ^= b; }
genesis               577 inline const uint256 operator&(const base_uint256& a, const base_uint256& b) { return uint256(a) &= b; }
genesis               578 inline const uint256 operator|(const base_uint256& a, const base_uint256& b) { return uint256(a) |= b; }
genesis               579 inline const uint256 operator+(const base_uint256& a, const base_uint256& b) { return uint256(a) += b; }
genesis               580 inline const uint256 operator-(const base_uint256& a, const base_uint256& b) { return uint256(a) -= b; }
genesis               581 
genesis               582 inline bool operator<(const base_uint256& a, const uint256& b)          { return (base_uint256)a <  (base_uint256)b; }
genesis               583 inline bool operator<=(const base_uint256& a, const uint256& b)         { return (base_uint256)a <= (base_uint256)b; }
genesis               584 inline bool operator>(const base_uint256& a, const uint256& b)          { return (base_uint256)a >  (base_uint256)b; }
genesis               585 inline bool operator>=(const base_uint256& a, const uint256& b)         { return (base_uint256)a >= (base_uint256)b; }
genesis               586 inline bool operator==(const base_uint256& a, const uint256& b)         { return (base_uint256)a == (base_uint256)b; }
genesis               587 inline bool operator!=(const base_uint256& a, const uint256& b)         { return (base_uint256)a != (base_uint256)b; }
genesis               588 inline const uint256 operator^(const base_uint256& a, const uint256& b) { return (base_uint256)a ^  (base_uint256)b; }
genesis               589 inline const uint256 operator&(const base_uint256& a, const uint256& b) { return (base_uint256)a &  (base_uint256)b; }
genesis               590 inline const uint256 operator|(const base_uint256& a, const uint256& b) { return (base_uint256)a |  (base_uint256)b; }
genesis               591 inline const uint256 operator+(const base_uint256& a, const uint256& b) { return (base_uint256)a +  (base_uint256)b; }
genesis               592 inline const uint256 operator-(const base_uint256& a, const uint256& b) { return (base_uint256)a -  (base_uint256)b; }
genesis               593 
genesis               594 inline bool operator<(const uint256& a, const base_uint256& b)          { return (base_uint256)a <  (base_uint256)b; }
genesis               595 inline bool operator<=(const uint256& a, const base_uint256& b)         { return (base_uint256)a <= (base_uint256)b; }
genesis               596 inline bool operator>(const uint256& a, const base_uint256& b)          { return (base_uint256)a >  (base_uint256)b; }
genesis               597 inline bool operator>=(const uint256& a, const base_uint256& b)         { return (base_uint256)a >= (base_uint256)b; }
genesis               598 inline bool operator==(const uint256& a, const base_uint256& b)         { return (base_uint256)a == (base_uint256)b; }
genesis               599 inline bool operator!=(const uint256& a, const base_uint256& b)         { return (base_uint256)a != (base_uint256)b; }
genesis               600 inline const uint256 operator^(const uint256& a, const base_uint256& b) { return (base_uint256)a ^  (base_uint256)b; }
genesis               601 inline const uint256 operator&(const uint256& a, const base_uint256& b) { return (base_uint256)a &  (base_uint256)b; }
genesis               602 inline const uint256 operator|(const uint256& a, const base_uint256& b) { return (base_uint256)a |  (base_uint256)b; }
genesis               603 inline const uint256 operator+(const uint256& a, const base_uint256& b) { return (base_uint256)a +  (base_uint256)b; }
genesis               604 inline const uint256 operator-(const uint256& a, const base_uint256& b) { return (base_uint256)a -  (base_uint256)b; }
genesis               605 
genesis               606 inline bool operator<(const uint256& a, const uint256& b)               { return (base_uint256)a <  (base_uint256)b; }
genesis               607 inline bool operator<=(const uint256& a, const uint256& b)              { return (base_uint256)a <= (base_uint256)b; }
genesis               608 inline bool operator>(const uint256& a, const uint256& b)               { return (base_uint256)a >  (base_uint256)b; }
genesis               609 inline bool operator>=(const uint256& a, const uint256& b)              { return (base_uint256)a >= (base_uint256)b; }
genesis               610 inline bool operator==(const uint256& a, const uint256& b)              { return (base_uint256)a == (base_uint256)b; }
genesis               611 inline bool operator!=(const uint256& a, const uint256& b)              { return (base_uint256)a != (base_uint256)b; }
genesis               612 inline const uint256 operator^(const uint256& a, const uint256& b)      { return (base_uint256)a ^  (base_uint256)b; }
genesis               613 inline const uint256 operator&(const uint256& a, const uint256& b)      { return (base_uint256)a &  (base_uint256)b; }
genesis               614 inline const uint256 operator|(const uint256& a, const uint256& b)      { return (base_uint256)a |  (base_uint256)b; }
genesis               615 inline const uint256 operator+(const uint256& a, const uint256& b)      { return (base_uint256)a +  (base_uint256)b; }
genesis               616 inline const uint256 operator-(const uint256& a, const uint256& b)      { return (base_uint256)a -  (base_uint256)b; }
genesis               617 
genesis               618 
genesis               619 
genesis               620 
genesis               621 
genesis               622 
genesis               623 
genesis               624 
genesis               625 
genesis               626 
genesis               627 
genesis               628 
genesis               629 inline int Testuint256AdHoc(std::vector<std::string> vArg)
genesis               630 {
genesis               631     uint256 g(0);
genesis               632 
genesis               633 
genesis               634     printf("%s\n", g.ToString().c_str());
genesis               635     g--;  printf("g--\n");
genesis               636     printf("%s\n", g.ToString().c_str());
genesis               637     g--;  printf("g--\n");
genesis               638     printf("%s\n", g.ToString().c_str());
genesis               639     g++;  printf("g++\n");
genesis               640     printf("%s\n", g.ToString().c_str());
genesis               641     g++;  printf("g++\n");
genesis               642     printf("%s\n", g.ToString().c_str());
genesis               643     g++;  printf("g++\n");
genesis               644     printf("%s\n", g.ToString().c_str());
genesis               645     g++;  printf("g++\n");
genesis               646     printf("%s\n", g.ToString().c_str());
genesis               647 
genesis               648 
genesis               649 
genesis               650     uint256 a(7);
genesis               651     printf("a=7\n");
genesis               652     printf("%s\n", a.ToString().c_str());
genesis               653 
genesis               654     uint256 b;
genesis               655     printf("b undefined\n");
genesis               656     printf("%s\n", b.ToString().c_str());
genesis               657     int c = 3;
genesis               658 
genesis               659     a = c;
genesis               660     a.pn[3] = 15;
genesis               661     printf("%s\n", a.ToString().c_str());
genesis               662     uint256 k(c);
genesis               663 
genesis               664     a = 5;
genesis               665     a.pn[3] = 15;
genesis               666     printf("%s\n", a.ToString().c_str());
genesis               667     b = 1;
genesis               668     b <<= 52;
genesis               669 
genesis               670     a |= b;
genesis               671 
genesis               672     a ^= 0x500;
genesis               673 
genesis               674     printf("a %s\n", a.ToString().c_str());
genesis               675 
genesis               676     a = a | b | (uint256)0x1000;
genesis               677 
genesis               678 
genesis               679     printf("a %s\n", a.ToString().c_str());
genesis               680     printf("b %s\n", b.ToString().c_str());
genesis               681 
genesis               682     a = 0xfffffffe;
genesis               683     a.pn[4] = 9;
genesis               684 
genesis               685     printf("%s\n", a.ToString().c_str());
genesis               686     a++;
genesis               687     printf("%s\n", a.ToString().c_str());
genesis               688     a++;
genesis               689     printf("%s\n", a.ToString().c_str());
genesis               690     a++;
genesis               691     printf("%s\n", a.ToString().c_str());
genesis               692     a++;
genesis               693     printf("%s\n", a.ToString().c_str());
genesis               694 
genesis               695     a--;
genesis               696     printf("%s\n", a.ToString().c_str());
genesis               697     a--;
genesis               698     printf("%s\n", a.ToString().c_str());
genesis               699     a--;
genesis               700     printf("%s\n", a.ToString().c_str());
genesis               701     uint256 d = a--;
genesis               702     printf("%s\n", d.ToString().c_str());
genesis               703     printf("%s\n", a.ToString().c_str());
genesis               704     a--;
genesis               705     printf("%s\n", a.ToString().c_str());
genesis               706     a--;
genesis               707     printf("%s\n", a.ToString().c_str());
genesis               708 
genesis               709     d = a;
genesis               710 
genesis               711     printf("%s\n", d.ToString().c_str());
genesis               712     for (int i = uint256::WIDTH-1; i >= 0; i--) printf("%08x", d.pn[i]); printf("\n");
genesis               713 
genesis               714     uint256 neg = d;
genesis               715     neg = ~neg;
genesis               716     printf("%s\n", neg.ToString().c_str());
genesis               717 
genesis               718 
genesis               719     uint256 e = uint256("0xABCDEF123abcdef12345678909832180000011111111");
genesis               720     printf("\n");
genesis               721     printf("%s\n", e.ToString().c_str());
genesis               722 
genesis               723 
genesis               724     printf("\n");
genesis               725     uint256 x1 = uint256("0xABCDEF123abcdef12345678909832180000011111111");
genesis               726     uint256 x2;
genesis               727     printf("%s\n", x1.ToString().c_str());
genesis               728     for (int i = 0; i < 270; i += 4)
genesis               729     {
genesis               730         x2 = x1 << i;
genesis               731         printf("%s\n", x2.ToString().c_str());
genesis               732     }
genesis               733 
genesis               734     printf("\n");
genesis               735     printf("%s\n", x1.ToString().c_str());
genesis               736     for (int i = 0; i < 270; i += 4)
genesis               737     {
genesis               738         x2 = x1;
genesis               739         x2 >>= i;
genesis               740         printf("%s\n", x2.ToString().c_str());
genesis               741     }
genesis               742 
genesis               743 
genesis               744     for (int i = 0; i < 100; i++)
genesis               745     {
genesis               746         uint256 k = (~uint256(0) >> i);
genesis               747         printf("%s\n", k.ToString().c_str());
genesis               748     }
genesis               749 
genesis               750     for (int i = 0; i < 100; i++)
genesis               751     {
genesis               752         uint256 k = (~uint256(0) << i);
genesis               753         printf("%s\n", k.ToString().c_str());
genesis               754     }
genesis               755 
genesis               756     return (0);
genesis               757 }
genesis               758 
genesis               759 #endif