X-Git-Url: https://git.novaco.in/?a=blobdiff_plain;f=Novacoin%2Fuint256.cs;h=dfaebea6de1dc67b9ee2b41a02bf3c9ab2e5c4b8;hb=8ad3c74259a603dc5f175c34ebe5a740c09ff6ae;hp=317b8d651b418e1942b1228e2158bb6783724de0;hpb=1dcac5faa2b1477034f82466ffb16170fa2e9bb6;p=NovacoinLibrary.git diff --git a/Novacoin/uint256.cs b/Novacoin/uint256.cs index 317b8d6..dfaebea 100644 --- a/Novacoin/uint256.cs +++ b/Novacoin/uint256.cs @@ -202,7 +202,6 @@ namespace Novacoin return ret; } - public static uint256 operator ++(uint256 a) { int i = 0; @@ -251,8 +250,89 @@ namespace Novacoin { return a - new uint256(b); } + + public static uint256 operator /(uint256 a, uint divisor) + { + var result = new uint256(); + + ulong r = 0; + int i = a.nWidth; + + while (i-- > 0) + { + r <<= 32; + r |= a.pn[i]; + result.pn[i] = (uint)(r / divisor); + r %= divisor; + } + + return result; + } + + public static uint256 operator *(uint256 a, uint multiplier) + { + var result = new uint256(); + + ulong c = 0; + uint i = 0; + + do + { + c += a.pn[i] * (ulong)multiplier; + result.pn[i] = (uint)c; + c >>= 32; + } while (++i < result.nWidth); + + return result; + } + + public static uint operator %(uint256 a, uint divisor) + { + ulong r = 0; + int i = a.nWidth; + + while (i-- > 0) + { + r <<= 32; + r |= a.pn[i]; + r %= divisor; + } + + return (uint)r; + } + + public static uint256 operator /(uint256 a, uint256 divisor) + { + if (divisor.bits <= 32) + { + return a / divisor.Low32; + } + + return Divide(a, divisor)[0]; + } + + public static uint256 operator %(uint256 a, uint256 divisor) + { + if (divisor.bits <= 32) + { + return a % divisor.Low32; + } + + return Divide(a, divisor)[1]; + } #endregion + public static uint256[] Divide(uint256 bi1, uint256 bi2) + { + // STUB! + + uint256[] ret = new uint256[2] { 0, 0 }; + + return ret; + } + + + #region Shift public static uint256 operator <<(uint256 a, int shift) {