2 using System.Collections.Generic;
3 using System.Diagnostics.Contracts;
6 using System.Threading.Tasks;
10 public class uint160 : base_uint
12 new protected int nWidth
14 get { return base.nWidth; }
15 private set { base.nWidth = value; }
17 new protected uint[] pn
19 get { return base.pn; }
20 private set { base.pn = value; }
26 pn = new uint[nWidth];
29 public uint160(uint160 b) : this()
31 for (int i = 0; i < nWidth; i++)
38 public uint160(ulong n) : this()
41 pn[1] = (uint)(n >> 32);
42 for (int i = 2; i < nWidth; i++)
48 public uint160(byte[] bytes) : this()
50 Contract.Requires<ArgumentException>(bytes.Length == 20, "Incorrect array length");
51 pn = Interop.ToUInt32Array(bytes);
54 public uint160(string hex) : this()
56 Contract.Requires<ArgumentException>(hex.Length == 40, "Incorrect string");
57 var bytes = Interop.ReverseBytes(Interop.HexToArray(hex));
58 pn = Interop.ToUInt32Array(bytes);
61 public static uint160 operator ~(uint160 a)
63 var ret = new uint160();
64 for (int i = 0; i < a.nWidth; i++)
71 public static uint160 operator -(uint160 a)
73 var ret = new uint160();
74 for (int i = 0; i < a.nWidth; i++)
83 public static uint160 operator ++(uint160 a)
86 while (++a.pn[i] == 0 && i < a.nWidth - 1)
93 public static uint160 operator --(uint160 a)
96 while (--a.pn[i] == uint.MaxValue && i < a.nWidth - 1)
103 public static uint160 operator ^(uint160 a, uint160 b)
105 var result = new uint160();
106 result.pn = new uint[a.nWidth];
107 for (int i = 0; i < result.nWidth; i++)
109 result.pn[i] = a.pn[i] ^ b.pn[i];
114 public static uint160 operator +(uint160 a, uint160 b)
116 var result = new uint160();
118 for (int i = 0; i < result.nWidth; i++)
120 ulong n = carry + a.pn[i] + b.pn[i];
121 result.pn[i] = (uint)(n & 0xffffffff);
127 public static uint160 operator +(uint160 a, ulong b)
129 return a + new uint160(b);
132 public static uint160 operator -(uint160 a, uint160 b)
137 public static uint160 operator -(uint160 a, ulong b)
139 return a - new uint160(b);
142 public static uint160 operator &(uint160 a, uint160 b)
144 var result = new uint160();
145 result.pn = new uint[a.nWidth];
146 for (int i = 0; i < result.nWidth; i++)
148 result.pn[i] = a.pn[i] & b.pn[i];
153 public static uint160 operator |(uint160 a, uint160 b)
155 var result = new uint160();
156 result.pn = new uint[a.nWidth];
157 for (int i = 0; i < result.nWidth; i++)
159 result.pn[i] = a.pn[i] | b.pn[i];
164 public static uint160 operator <<(uint160 a, int shift)
166 var result = new uint160();
170 for (int i = 0; i < a.nWidth; i++)
172 if (i + k + 1 < a.nWidth && shift != 0)
174 result.pn[i + k + 1] |= (a.pn[i] >> (32 - shift));
177 if (i + k < a.nWidth)
179 result.pn[i + k] |= (a.pn[i] << shift);
186 public static uint160 operator >>(uint160 a, int shift)
188 var result = new uint160();
192 for (int i = 0; i < a.nWidth; i++)
194 if (i - k - 1 >= 0 && shift != 0)
196 result.pn[i - k - 1] |= (a.pn[i] << (32 - shift));
201 result.pn[i - k] |= (a.pn[i] >> shift);