PageRenderTime 54ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

/src/uint256.h

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