uint256.h 24 KB

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