/src/uint256.h

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