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