static NumberHelper() { Instances = new NumberHelper[MaxRadix + 1]; InstancesLock = new object(); Digitals = (char *)Marshal.AllocHGlobal(MaxRadix * sizeof(char)); Radixes = (byte *)Marshal.AllocHGlobal((DigitalsMaxValue + 1) * sizeof(byte)); IgnoreCaseRadixes = (byte *)Marshal.AllocHGlobal((DigitalsMaxValue + 1) * sizeof(byte)); for (int i = 0; i < DigitalsMaxValue; i++) { Radixes[i] = ErrorRadix; IgnoreCaseRadixes[i] = ErrorRadix; } Radixes[SplitSign] = SplitRadix; IgnoreCaseRadixes[SplitSign] = SplitRadix; for (uint i = 0; i < MaxRadix; i++) { char digital = SlowToDigital(i); Digitals[i] = digital; Radixes[digital] = SlowToRadix(digital); IgnoreCaseRadixes[digital] = SlowToRadixIgnoreCase(digital); } Decimal = GetOrCreateInstance(DecimalRadix); DecimalThreeDigitals = Decimal.threeDigitals; DecimalUInt64Numbers = Decimal.uInt64Numbers; }
static NumberHelper() { var size = 1000; threeChars = (ThreeChar *)Marshal.AllocHGlobal(size * sizeof(ThreeChar)); threeBytes = (ThreeByte *)Marshal.AllocHGlobal(size * sizeof(ThreeByte)); for (uint i = 100; i < size; i++) { var chs = i.ToString(); threeChars[i].v1 = chs[0]; threeChars[i].v2 = chs[1]; threeChars[i].v3 = chs[2]; threeBytes[i].v1 = (byte)chs[0]; threeBytes[i].v2 = (byte)chs[1]; threeBytes[i].v3 = (byte)chs[2]; } }
/// <summary> /// 初始化实例。 /// </summary> /// <param name="radix">指定进制</param> public NumberHelper(byte radix) { if (radix > MaxRadix || radix < MinRadix) { throw new ArgumentOutOfRangeException(nameof(radix)); } this.radix = radix; /* binary no rounded. */ rounded = (byte)(radix == 2 ? 2 : (radix + 1) / 2); if (radix <= IgnoreCaseMaxRadix) { radixes = IgnoreCaseRadixes; } else { radixes = Radixes; } threeDigitalsLength = (uint)SlowPow(radix, 3); threeDigitals = (ThreeChar *)Marshal.AllocHGlobal((int)(threeDigitalsLength * sizeof(ThreeChar))); for (uint i = 0; i < threeDigitalsLength; i++) { threeDigitals[i] = SlowToThreeChar(i); } int64NumbersLength = SlowGetLength(0x8000000000000000); uInt64NumbersLength = SlowGetLength(0xFFFFFFFFFFFFFFFF); uInt32NumbersLength = SlowGetLength(0xFFFFFFFF); uInt64Numbers = new ulong[uInt64NumbersLength]; for (uint i = 0; i < uInt64NumbersLength; i++) { uInt64Numbers[i] = SlowPow(radix, i); } uInt32Numbers = new uint[uInt32NumbersLength]; for (uint i = 0; i < uInt32NumbersLength; i++) { uInt32Numbers[i] = (uint)SlowPow(radix, i); } positiveExponentsLength = SlowGetLength(DoubleMaxPositive); positiveExponentsRight = positiveExponentsLength - 1; positiveExponents = new double[positiveExponentsLength]; for (int i = 0; i < positiveExponentsLength; i++) { positiveExponents[i] = Math.Pow(radix, i); } negativeExponentsLength = SlowGetFractionalLength(DoubleMinPositive); negativeExponentsRight = negativeExponentsLength - 1; negativeExponents = new double[negativeExponentsLength]; for (int i = 0; i < negativeExponentsLength; i++) { negativeExponents[i] = Math.Pow(radix, -i); } maxDoubleLength = SlowGetLength(0xFFFFFFFFFFFFF); maxSingleLength = SlowGetLength(0x7FFFFFFF); divisorLength = (byte)(uInt32NumbersLength - 1); divisor = uInt32Numbers[divisorLength]; }
/// <summary> /// 初始化实例。 /// </summary> /// <param name="radix">指定进制</param> NumberHelper(byte radix) { if (radix > MaxRadix || radix < MinRadix) { throw new ArgumentOutOfRangeException(nameof(radix)); } this.radix = radix; if (radix <= IgnoreCaseMaxRadix) { radixes = IgnoreCaseRadixes; } else { radixes = Radixes; } threeDigitalsLength = (uint)SlowPow(radix, 3); threeDigitals = (ThreeChar *)Marshal.AllocHGlobal((int)(threeDigitalsLength * sizeof(ThreeChar))); for (uint i = 0; i < threeDigitalsLength; i++) { threeDigitals[i] = SlowToThreeChar(i); } int64NumbersLength = SlowGetLength(0x8000000000000000); uInt64NumbersLength = SlowGetLength(0xFFFFFFFFFFFFFFFF); uInt32NumbersLength = SlowGetLength(0xFFFFFFFF); uInt64Numbers = new ulong[uInt64NumbersLength]; for (uint i = 0; i < uInt64NumbersLength; i++) { uInt64Numbers[i] = SlowPow(radix, i); } uInt32Numbers = new uint[uInt32NumbersLength]; for (uint i = 0; i < uInt32NumbersLength; i++) { uInt32Numbers[i] = (uint)SlowPow(radix, i); } positiveExponentsLength = SlowGetLength(DoubleMaxPositive); positiveExponents = new double[positiveExponentsLength]; for (int i = 0; i < positiveExponentsLength; i++) { positiveExponents[i] = Math.Pow(radix, i); } negativeExponentsLength = SlowGetFractionalLength(DoubleMinPositive); negativeExponents = new double[negativeExponentsLength]; for (int i = 0; i < negativeExponentsLength; i++) { negativeExponents[i] = Math.Pow(radix, -i); } maxDoubleDigitalsLength = SlowGetLength(0xFFFFFFFFFFFFF) + 1 /* Integer: 1 */; maxSingleDigitalsLength = SlowGetLength(0x7FFFFF) + 1 /* Integer: 1 */; MaxDoubleStringLength = maxDoubleDigitalsLength + 4 /* Sign + Dot + Exp + ExpSign */ + SlowGetLength(0x200); MaxSingleStringLength = maxSingleDigitalsLength + 4 /* Sign + Dot + Exp + ExpSign */ + SlowGetLength(0x80); divisorLength = (byte)(uInt32NumbersLength - 1); divisor = uInt32Numbers[divisorLength]; }