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