287be58af5f9faeb28168dc458243febbf4be5e1
[NovacoinLibrary.git] / Novacoin / base_uint.cs
1 \feffusing System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6
7 namespace Novacoin
8 {
9     public class base_uint
10     {
11         protected uint nWidth;
12         protected uint[] pn;
13
14         public static bool operator !(base_uint a)
15         {
16             for (int i = 0; i < a.nWidth; i++)
17             {
18                 if (a.pn[i] != 0)
19                 {
20                     return false;
21                 }
22             }
23             return true;
24         }
25
26         public static base_uint operator ~(base_uint a)
27         {
28             var ret = new base_uint();
29             for (int i = 0; i < a.nWidth; i++)
30             {
31                 ret.pn[i] = ~a.pn[i];
32             }
33             return ret;
34         }
35
36         public static base_uint operator -(base_uint a)
37         {
38             var ret = new base_uint();
39             for (int i = 0; i < a.nWidth; i++)
40             {
41                 ret.pn[i] = ~a.pn[i];
42             }
43             ret++;
44             return ret;
45         }
46
47         public static base_uint operator ++(base_uint a)
48         {
49             // prefix operator
50             int i = 0;
51             while (++a.pn[i] == 0 && i < a.nWidth - 1)
52             {
53                 i++;
54             }
55             return a;
56         }
57
58         public static base_uint operator --(base_uint a)
59         {
60             // prefix operator
61             int i = 0;
62             while (--a.pn[i] == uint.MaxValue && i < a.nWidth - 1)
63             {
64                 i++;
65             }
66             return a;
67         }
68
69         public static base_uint operator ^(base_uint a, base_uint b)
70         {
71             var c = new base_uint();
72             c.pn = new uint[a.nWidth];
73             for (int i = 0; i < c.nWidth; i++)
74             {
75                 c.pn[i] = a.pn[i] ^ b.pn[i];
76             }
77             return c;
78         }
79
80         public static base_uint operator +(base_uint a, base_uint b)
81         {
82             var result = new base_uint();
83             ulong carry = 0;
84             for (int i = 0; i < result.nWidth; i++)
85             {
86                 ulong n = carry + a.pn[i] + b.pn[i];
87                 result.pn[i] = (uint)(n & 0xffffffff);
88                 carry = n >> 32;
89             }
90             return result;
91         }
92
93
94
95     }
96 }