Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ Divide() [1/5]

static unsafe void System.Numerics.BigIntegerCalculator.Divide ( uint * left,
int leftLength,
uint * right,
int rightLength,
uint * bits,
int bitsLength )
inlinestaticprivate

Definition at line 541 of file BigIntegerCalculator.cs.

542 {
543 uint num = right[rightLength - 1];
544 uint num2 = ((rightLength > 1) ? right[rightLength - 2] : 0u);
545 int num3 = LeadingZeros(num);
546 int num4 = 32 - num3;
547 if (num3 > 0)
548 {
549 uint num5 = ((rightLength > 2) ? right[rightLength - 3] : 0u);
550 num = (num << num3) | (num2 >> num4);
551 num2 = (num2 << num3) | (num5 >> num4);
552 }
553 for (int num6 = leftLength; num6 >= rightLength; num6--)
554 {
555 int num7 = num6 - rightLength;
556 uint num8 = ((num6 < leftLength) ? left[num6] : 0u);
557 ulong num9 = ((ulong)num8 << 32) | left[num6 - 1];
558 uint num10 = ((num6 > 1) ? left[num6 - 2] : 0u);
559 if (num3 > 0)
560 {
561 uint num11 = ((num6 > 2) ? left[num6 - 3] : 0u);
562 num9 = (num9 << num3) | (num10 >> num4);
563 num10 = (num10 << num3) | (num11 >> num4);
564 }
565 ulong num12 = num9 / num;
566 if (num12 > uint.MaxValue)
567 {
568 num12 = 4294967295uL;
569 }
570 while (DivideGuessTooBig(num12, num9, num10, num, num2))
571 {
572 num12--;
573 }
574 if (num12 != 0)
575 {
576 uint num13 = SubtractDivisor(left + num7, leftLength - num7, right, rightLength, num12);
577 if (num13 != num8)
578 {
579 num13 = AddDivisor(left + num7, leftLength - num7, right, rightLength);
580 num12--;
581 }
582 }
583 if (bitsLength != 0)
584 {
585 bits[num7] = (uint)num12;
586 }
587 if (num6 < leftLength)
588 {
589 left[num6] = 0u;
590 }
591 }
592 }
static bool DivideGuessTooBig(ulong q, ulong valHi, uint valLo, uint divHi, uint divLo)
static unsafe uint AddDivisor(uint *left, int leftLength, uint *right, int rightLength)
static unsafe uint SubtractDivisor(uint *left, int leftLength, uint *right, int rightLength, ulong q)

References System.Numerics.BigIntegerCalculator.AddDivisor(), System.Numerics.BigIntegerCalculator.DivideGuessTooBig(), System.Numerics.BigIntegerCalculator.LeadingZeros(), and System.Numerics.BigIntegerCalculator.SubtractDivisor().