/src/uint256.h

https://github.com/namecoin/namecoin · C Header · 765 lines · 603 code · 138 blank · 24 comment · 109 complexity · 99dabab4826052a633777ae77b6f1fc9 MD5 · raw file

  1. // Copyright (c) 2009-2010 Satoshi Nakamoto
  2. // Distributed under the MIT/X11 software license, see the accompanying
  3. // file license.txt or http://www.opensource.org/licenses/mit-license.php.
  4. #ifndef BITCOIN_UINT256_H
  5. #define BITCOIN_UINT256_H
  6. #include "serialize.h"
  7. #include <limits.h>
  8. #include <string>
  9. #include <vector>
  10. #if defined(_MSC_VER) || defined(__BORLANDC__)
  11. typedef __int64 int64;
  12. typedef unsigned __int64 uint64;
  13. #else
  14. typedef long long int64;
  15. typedef unsigned long long uint64;
  16. #endif
  17. #if defined(_MSC_VER) && _MSC_VER < 1300
  18. #define for if (false) ; else for
  19. #endif
  20. inline int Testuint256AdHoc(std::vector<std::string> vArg);
  21. // We have to keep a separate base class without constructors
  22. // so the compiler will let us use it in a union
  23. template<unsigned int BITS>
  24. class base_uint
  25. {
  26. protected:
  27. enum { WIDTH=BITS/32 };
  28. unsigned int pn[WIDTH];
  29. public:
  30. bool operator!() const
  31. {
  32. for (int i = 0; i < WIDTH; i++)
  33. if (pn[i] != 0)
  34. return false;
  35. return true;
  36. }
  37. const base_uint operator~() const
  38. {
  39. base_uint ret;
  40. for (int i = 0; i < WIDTH; i++)
  41. ret.pn[i] = ~pn[i];
  42. return ret;
  43. }
  44. const base_uint operator-() const
  45. {
  46. base_uint ret;
  47. for (int i = 0; i < WIDTH; i++)
  48. ret.pn[i] = ~pn[i];
  49. ret++;
  50. return ret;
  51. }
  52. base_uint& operator=(uint64 b)
  53. {
  54. pn[0] = (unsigned int)b;
  55. pn[1] = (unsigned int)(b >> 32);
  56. for (int i = 2; i < WIDTH; i++)
  57. pn[i] = 0;
  58. return *this;
  59. }
  60. base_uint& operator^=(const base_uint& b)
  61. {
  62. for (int i = 0; i < WIDTH; i++)
  63. pn[i] ^= b.pn[i];
  64. return *this;
  65. }
  66. base_uint& operator&=(const base_uint& b)
  67. {
  68. for (int i = 0; i < WIDTH; i++)
  69. pn[i] &= b.pn[i];
  70. return *this;
  71. }
  72. base_uint& operator|=(const base_uint& b)
  73. {
  74. for (int i = 0; i < WIDTH; i++)
  75. pn[i] |= b.pn[i];
  76. return *this;
  77. }
  78. base_uint& operator^=(uint64 b)
  79. {
  80. pn[0] ^= (unsigned int)b;
  81. pn[1] ^= (unsigned int)(b >> 32);
  82. return *this;
  83. }
  84. base_uint& operator&=(uint64 b)
  85. {
  86. pn[0] &= (unsigned int)b;
  87. pn[1] &= (unsigned int)(b >> 32);
  88. return *this;
  89. }
  90. base_uint& operator|=(uint64 b)
  91. {
  92. pn[0] |= (unsigned int)b;
  93. pn[1] |= (unsigned int)(b >> 32);
  94. return *this;
  95. }
  96. base_uint& operator<<=(unsigned int shift)
  97. {
  98. base_uint a(*this);
  99. for (int i = 0; i < WIDTH; i++)
  100. pn[i] = 0;
  101. int k = shift / 32;
  102. shift = shift % 32;
  103. for (int i = 0; i < WIDTH; i++)
  104. {
  105. if (i+k+1 < WIDTH && shift != 0)
  106. pn[i+k+1] |= (a.pn[i] >> (32-shift));
  107. if (i+k < WIDTH)
  108. pn[i+k] |= (a.pn[i] << shift);
  109. }
  110. return *this;
  111. }
  112. base_uint& operator>>=(unsigned int shift)
  113. {
  114. base_uint a(*this);
  115. for (int i = 0; i < WIDTH; i++)
  116. pn[i] = 0;
  117. int k = shift / 32;
  118. shift = shift % 32;
  119. for (int i = 0; i < WIDTH; i++)
  120. {
  121. if (i-k-1 >= 0 && shift != 0)
  122. pn[i-k-1] |= (a.pn[i] << (32-shift));
  123. if (i-k >= 0)
  124. pn[i-k] |= (a.pn[i] >> shift);
  125. }
  126. return *this;
  127. }
  128. base_uint& operator+=(const base_uint& b)
  129. {
  130. uint64 carry = 0;
  131. for (int i = 0; i < WIDTH; i++)
  132. {
  133. uint64 n = carry + pn[i] + b.pn[i];
  134. pn[i] = n & 0xffffffff;
  135. carry = n >> 32;
  136. }
  137. return *this;
  138. }
  139. base_uint& operator-=(const base_uint& b)
  140. {
  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-=(uint64 b64)
  152. {
  153. base_uint b;
  154. b = b64;
  155. *this += -b;
  156. return *this;
  157. }
  158. base_uint& operator++()
  159. {
  160. // prefix operator
  161. int i = 0;
  162. while (++pn[i] == 0 && i < WIDTH-1)
  163. i++;
  164. return *this;
  165. }
  166. const base_uint operator++(int)
  167. {
  168. // postfix operator
  169. const base_uint ret = *this;
  170. ++(*this);
  171. return ret;
  172. }
  173. base_uint& operator--()
  174. {
  175. // prefix operator
  176. int i = 0;
  177. while (--pn[i] == -1 && i < WIDTH-1)
  178. i++;
  179. return *this;
  180. }
  181. const base_uint operator--(int)
  182. {
  183. // postfix operator
  184. const base_uint ret = *this;
  185. --(*this);
  186. return ret;
  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 false;
  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 true;
  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 false;
  220. }
  221. friend inline bool operator>=(const base_uint& a, const base_uint& b)
  222. {
  223. for (int i = base_uint::WIDTH-1; i >= 0; i--)
  224. {
  225. if (a.pn[i] > b.pn[i])
  226. return true;
  227. else if (a.pn[i] < b.pn[i])
  228. return false;
  229. }
  230. return true;
  231. }
  232. friend inline bool operator==(const base_uint& a, const base_uint& b)
  233. {
  234. for (int i = 0; i < base_uint::WIDTH; i++)
  235. if (a.pn[i] != b.pn[i])
  236. return false;
  237. return true;
  238. }
  239. friend inline bool operator==(const base_uint& a, uint64 b)
  240. {
  241. if (a.pn[0] != (unsigned int)b)
  242. return false;
  243. if (a.pn[1] != (unsigned int)(b >> 32))
  244. return false;
  245. for (int i = 2; i < base_uint::WIDTH; i++)
  246. if (a.pn[i] != 0)
  247. return false;
  248. return true;
  249. }
  250. friend inline bool operator!=(const base_uint& a, const base_uint& b)
  251. {
  252. return (!(a == b));
  253. }
  254. friend inline bool operator!=(const base_uint& a, uint64 b)
  255. {
  256. return (!(a == b));
  257. }
  258. std::string GetHex() const
  259. {
  260. char psz[sizeof(pn)*2 + 1];
  261. for (int i = 0; i < sizeof(pn); i++)
  262. sprintf(psz + i*2, "%02x", ((unsigned char*)pn)[sizeof(pn) - i - 1]);
  263. return std::string(psz, psz + sizeof(pn)*2);
  264. }
  265. void SetHex(const char* psz)
  266. {
  267. for (int i = 0; i < WIDTH; i++)
  268. pn[i] = 0;
  269. // skip leading spaces
  270. while (isspace(*psz))
  271. psz++;
  272. // skip 0x
  273. if (psz[0] == '0' && tolower(psz[1]) == 'x')
  274. psz += 2;
  275. // hex string to uint
  276. 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 };
  277. const char* pbegin = psz;
  278. while (phexdigit[*psz] || *psz == '0')
  279. psz++;
  280. psz--;
  281. unsigned char* p1 = (unsigned char*)pn;
  282. unsigned char* pend = p1 + WIDTH * 4;
  283. while (psz >= pbegin && p1 < pend)
  284. {
  285. *p1 = phexdigit[(unsigned char)*psz--];
  286. if (psz >= pbegin)
  287. {
  288. *p1 |= (phexdigit[(unsigned char)*psz--] << 4);
  289. p1++;
  290. }
  291. }
  292. }
  293. void SetHex(const std::string& str)
  294. {
  295. SetHex(str.c_str());
  296. }
  297. std::string ToString() const
  298. {
  299. return (GetHex());
  300. }
  301. unsigned char* begin()
  302. {
  303. return (unsigned char*)&pn[0];
  304. }
  305. unsigned char* end()
  306. {
  307. return (unsigned char*)&pn[WIDTH];
  308. }
  309. unsigned int size()
  310. {
  311. return sizeof(pn);
  312. }
  313. unsigned int GetSerializeSize(int nType=0, int nVersion=VERSION) const
  314. {
  315. return sizeof(pn);
  316. }
  317. template<typename Stream>
  318. void Serialize(Stream& s, int nType=0, int nVersion=VERSION) const
  319. {
  320. s.write((char*)pn, sizeof(pn));
  321. }
  322. template<typename Stream>
  323. void Unserialize(Stream& s, int nType=0, int nVersion=VERSION)
  324. {
  325. s.read((char*)pn, sizeof(pn));
  326. }
  327. friend class uint160;
  328. friend class uint256;
  329. friend inline int Testuint256AdHoc(std::vector<std::string> vArg);
  330. };
  331. typedef base_uint<160> base_uint160;
  332. typedef base_uint<256> base_uint256;
  333. //
  334. // uint160 and uint256 could be implemented as templates, but to keep
  335. // compile errors and debugging cleaner, they're copy and pasted.
  336. //
  337. //////////////////////////////////////////////////////////////////////////////
  338. //
  339. // uint160
  340. //
  341. class uint160 : public base_uint160
  342. {
  343. public:
  344. typedef base_uint160 basetype;
  345. uint160()
  346. {
  347. for (int i = 0; i < WIDTH; i++)
  348. pn[i] = 0;
  349. }
  350. uint160(const basetype& b)
  351. {
  352. for (int i = 0; i < WIDTH; i++)
  353. pn[i] = b.pn[i];
  354. }
  355. uint160& operator=(const basetype& b)
  356. {
  357. for (int i = 0; i < WIDTH; i++)
  358. pn[i] = b.pn[i];
  359. return *this;
  360. }
  361. uint160(uint64 b)
  362. {
  363. pn[0] = (unsigned int)b;
  364. pn[1] = (unsigned int)(b >> 32);
  365. for (int i = 2; i < WIDTH; i++)
  366. pn[i] = 0;
  367. }
  368. uint160& operator=(uint64 b)
  369. {
  370. pn[0] = (unsigned int)b;
  371. pn[1] = (unsigned int)(b >> 32);
  372. for (int i = 2; i < WIDTH; i++)
  373. pn[i] = 0;
  374. return *this;
  375. }
  376. explicit uint160(const std::string& str)
  377. {
  378. SetHex(str);
  379. }
  380. explicit uint160(const std::vector<unsigned char>& vch)
  381. {
  382. if (vch.size() == sizeof(pn))
  383. memcpy(pn, &vch[0], sizeof(pn));
  384. else
  385. *this = 0;
  386. }
  387. };
  388. inline bool operator==(const uint160& a, uint64 b) { return (base_uint160)a == b; }
  389. inline bool operator!=(const uint160& a, uint64 b) { return (base_uint160)a != b; }
  390. inline const uint160 operator<<(const base_uint160& a, unsigned int shift) { return uint160(a) <<= shift; }
  391. inline const uint160 operator>>(const base_uint160& a, unsigned int shift) { return uint160(a) >>= shift; }
  392. inline const uint160 operator<<(const 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 base_uint160& a, const base_uint160& b) { return uint160(a) ^= b; }
  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 bool operator<(const base_uint160& a, const uint160& b) { return (base_uint160)a < (base_uint160)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 const uint160 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 bool operator<(const uint160& a, const base_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 const uint160 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 bool operator<(const uint160& a, const 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 const uint160 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. //////////////////////////////////////////////////////////////////////////////
  433. //
  434. // uint256
  435. //
  436. class uint256 : public base_uint256
  437. {
  438. public:
  439. typedef base_uint256 basetype;
  440. uint256()
  441. {
  442. for (int i = 0; i < WIDTH; i++)
  443. pn[i] = 0;
  444. }
  445. uint256(const basetype& b)
  446. {
  447. for (int i = 0; i < WIDTH; i++)
  448. pn[i] = b.pn[i];
  449. }
  450. uint256& operator=(const basetype& b)
  451. {
  452. for (int i = 0; i < WIDTH; i++)
  453. pn[i] = b.pn[i];
  454. return *this;
  455. }
  456. uint256(uint64 b)
  457. {
  458. pn[0] = (unsigned int)b;
  459. pn[1] = (unsigned int)(b >> 32);
  460. for (int i = 2; i < WIDTH; i++)
  461. pn[i] = 0;
  462. }
  463. uint256& operator=(uint64 b)
  464. {
  465. pn[0] = (unsigned int)b;
  466. pn[1] = (unsigned int)(b >> 32);
  467. for (int i = 2; i < WIDTH; i++)
  468. pn[i] = 0;
  469. return *this;
  470. }
  471. explicit uint256(const std::string& str)
  472. {
  473. SetHex(str);
  474. }
  475. explicit uint256(const std::vector<unsigned char>& vch)
  476. {
  477. if (vch.size() == sizeof(pn))
  478. memcpy(pn, &vch[0], sizeof(pn));
  479. else
  480. *this = 0;
  481. }
  482. };
  483. inline bool operator==(const uint256& a, uint64 b) { return (base_uint256)a == b; }
  484. inline bool operator!=(const uint256& a, uint64 b) { return (base_uint256)a != b; }
  485. inline const uint256 operator<<(const base_uint256& a, unsigned int shift) { return uint256(a) <<= shift; }
  486. inline const uint256 operator>>(const base_uint256& a, unsigned int shift) { return uint256(a) >>= shift; }
  487. inline const uint256 operator<<(const 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 base_uint256& a, const base_uint256& b) { return uint256(a) ^= b; }
  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 bool operator<(const base_uint256& a, const uint256& b) { return (base_uint256)a < (base_uint256)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 const uint256 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 bool operator<(const uint256& a, const base_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 const uint256 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 bool operator<(const uint256& a, const 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 const uint256 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 int Testuint256AdHoc(std::vector<std::string> vArg)
  528. {
  529. uint256 g(0);
  530. printf("%s\n", g.ToString().c_str());
  531. g--; printf("g--\n");
  532. printf("%s\n", g.ToString().c_str());
  533. g--; printf("g--\n");
  534. printf("%s\n", g.ToString().c_str());
  535. g++; printf("g++\n");
  536. printf("%s\n", g.ToString().c_str());
  537. g++; printf("g++\n");
  538. printf("%s\n", g.ToString().c_str());
  539. g++; printf("g++\n");
  540. printf("%s\n", g.ToString().c_str());
  541. g++; printf("g++\n");
  542. printf("%s\n", g.ToString().c_str());
  543. uint256 a(7);
  544. printf("a=7\n");
  545. printf("%s\n", a.ToString().c_str());
  546. uint256 b;
  547. printf("b undefined\n");
  548. printf("%s\n", b.ToString().c_str());
  549. int c = 3;
  550. a = c;
  551. a.pn[3] = 15;
  552. printf("%s\n", a.ToString().c_str());
  553. uint256 k(c);
  554. a = 5;
  555. a.pn[3] = 15;
  556. printf("%s\n", a.ToString().c_str());
  557. b = 1;
  558. b <<= 52;
  559. a |= b;
  560. a ^= 0x500;
  561. printf("a %s\n", a.ToString().c_str());
  562. a = a | b | (uint256)0x1000;
  563. printf("a %s\n", a.ToString().c_str());
  564. printf("b %s\n", b.ToString().c_str());
  565. a = 0xfffffffe;
  566. a.pn[4] = 9;
  567. printf("%s\n", a.ToString().c_str());
  568. a++;
  569. printf("%s\n", a.ToString().c_str());
  570. a++;
  571. printf("%s\n", a.ToString().c_str());
  572. a++;
  573. printf("%s\n", a.ToString().c_str());
  574. a++;
  575. printf("%s\n", a.ToString().c_str());
  576. a--;
  577. printf("%s\n", a.ToString().c_str());
  578. a--;
  579. printf("%s\n", a.ToString().c_str());
  580. a--;
  581. printf("%s\n", a.ToString().c_str());
  582. uint256 d = a--;
  583. printf("%s\n", d.ToString().c_str());
  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. d = a;
  590. printf("%s\n", d.ToString().c_str());
  591. for (int i = uint256::WIDTH-1; i >= 0; i--) printf("%08x", d.pn[i]); printf("\n");
  592. uint256 neg = d;
  593. neg = ~neg;
  594. printf("%s\n", neg.ToString().c_str());
  595. uint256 e = uint256("0xABCDEF123abcdef12345678909832180000011111111");
  596. printf("\n");
  597. printf("%s\n", e.ToString().c_str());
  598. printf("\n");
  599. uint256 x1 = uint256("0xABCDEF123abcdef12345678909832180000011111111");
  600. uint256 x2;
  601. printf("%s\n", x1.ToString().c_str());
  602. for (int i = 0; i < 270; i += 4)
  603. {
  604. x2 = x1 << i;
  605. printf("%s\n", x2.ToString().c_str());
  606. }
  607. printf("\n");
  608. printf("%s\n", x1.ToString().c_str());
  609. for (int i = 0; i < 270; i += 4)
  610. {
  611. x2 = x1;
  612. x2 >>= i;
  613. printf("%s\n", x2.ToString().c_str());
  614. }
  615. for (int i = 0; i < 100; i++)
  616. {
  617. uint256 k = (~uint256(0) >> i);
  618. printf("%s\n", k.ToString().c_str());
  619. }
  620. for (int i = 0; i < 100; i++)
  621. {
  622. uint256 k = (~uint256(0) << i);
  623. printf("%s\n", k.ToString().c_str());
  624. }
  625. return (0);
  626. }
  627. #endif