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