/// <summary> /// Shifts and optionally precision-extends the arguments to prepare for Div_32 /// </summary> /// <param name="n1"></param> /// <param name="n2"></param> private static int MakeSafeDiv(BigInt n1, BigInt n2) { int shift = n2.GetDivBitshift(); int n1MSD = n1.GetMSD(); uint temp = n1.digitArray[n1MSD]; if (n1MSD == n1.digitArray.Length - 1 && ((temp << shift) >> shift) != n1.digitArray[n1MSD]) { //Precision-extend n1 and n2 if necessary int digits = n1.digitArray.Length; n1.SetNumDigits(digits + 1); n2.SetNumDigits(digits + 1); } //Logical left-shift n1 and n2 n1.LSH(shift); n2.LSH(shift); return shift; }