public HugeInteger(string value) { _stringValue = null; value = value.Trim(); if (!value.StartsWith("-")) { Sign = HugeIntegerSign.Positive; } else { Sign = HugeIntegerSign.Negative; value = value .Substring(1) .TrimStart('0'); } _digits = value .Select(digit => byte.Parse(digit.ToString())) .Reverse() .ToArray(); if (_digits.Length == 0) { _digits = null; Sign = HugeIntegerSign.Positive; } _hashCode = null; }
private HugeInteger(HugeIntegerSign sign, byte[] digits) { _stringValue = null; digits = StripLeadingZeros(digits); if (digits == null || digits.Length == 0) { _digits = null; Sign = HugeIntegerSign.Positive; } else { var tempDigits = new List <byte>(digits); for (int cnt = tempDigits.Count - 1; cnt >= 0; cnt--) { if (tempDigits[cnt] != 0) { break; } else { tempDigits.RemoveAt(cnt); } } Sign = tempDigits.Count == 0 ? HugeIntegerSign.Positive : sign; _digits = tempDigits.ToArray(); } _hashCode = null; }
private static HugeIntegerSign Flip(HugeIntegerSign sign) { switch (sign) { case HugeIntegerSign.Positive: return(HugeIntegerSign.Negative); case HugeIntegerSign.Negative: return(HugeIntegerSign.Positive); default: throw new Exception("Invalid sign: " + sign); } }