PageRenderTime 29ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/include/coin/uint256.h

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