internal static void inplaceShiftLeft(BigInteger val, int count) { int intCount = count >> 5; // count of integers val.numberLength += intCount + ( BigDecimal .numberOfLeadingZeros(val.digits[val.numberLength - 1]) - ( count & 31 ) >= 0 ? 0 : 1 ); shiftLeft(val.digits, val.digits, intCount, count & 31); val.cutOffLeadingZeroes(); val.unCache(); }
internal static void inplaceShiftRight(BigInteger val, int count) { int sign = val.signum(); if (count == 0 || val.signum() == 0) return; int intCount = count >> 5; // count of integers val.numberLength -= intCount; if (!shiftRight(val.digits, val.numberLength, val.digits, intCount, count & 31) && sign < 0) { // remainder not zero: add one to the result int i; for (i = 0; ( i < val.numberLength ) && ( val.digits[i] == -1 ); i++) { val.digits[i] = 0; } if (i == val.numberLength) { val.numberLength++; } val.digits[i]++; } val.cutOffLeadingZeroes(); val.unCache(); }
internal static void completeInPlaceAdd(BigInteger op1, BigInteger op2) { if (op1.sign == 0) Array.Copy(op2.digits, op1.digits, op2.numberLength); else if (op2.sign == 0) return; else if (op1.sign == op2.sign) add (op1.digits, op1.digits, op1.numberLength, op2.digits, op2.numberLength); else { int sign = unsignedArraysCompare(op1.digits, op2.digits, op1.numberLength, op2.numberLength); if (sign > 0) subtract (op1.digits, op1.digits, op1.numberLength, op2.digits, op2.numberLength); else { inverseSubtract (op1.digits, op1.digits, op1.numberLength, op2.digits, op2.numberLength); op1.sign = -op1.sign; } } op1.numberLength = Math.Max(op1.numberLength, op2.numberLength) + 1; op1.cutOffLeadingZeroes (); op1.unCache(); }
internal static void inplaceSubtract(BigInteger op1, BigInteger op2) { subtract (op1.digits, op1.digits, op1.numberLength, op2.digits, op2.numberLength); op1.cutOffLeadingZeroes (); op1.unCache(); }
internal static void inplaceAdd(BigInteger op1, int addend) { int carry = inplaceAdd(op1.digits, op1.numberLength, addend); if (carry == 1) { op1.digits[op1.numberLength] = 1; op1.numberLength++; } op1.unCache(); }
internal static void inplaceAdd(BigInteger op1, BigInteger op2) { // PRE: op1 >= op2 > 0 add (op1.digits, op1.digits, op1.numberLength, op2.digits, op2.numberLength); op1.numberLength = Math.Min(Math.Max(op1.numberLength, op2.numberLength) + 1, op1.digits.Length); op1.cutOffLeadingZeroes (); op1.unCache(); }
internal static void completeInPlaceSubtract(BigInteger op1, BigInteger op2) { int resultSign = op1.compareTo (op2); if (op1.sign == 0) { Array.Copy(op2.digits, op1.digits, op2.numberLength); op1.sign = -op2.sign; } else if (op1.sign != op2.sign) { add (op1.digits, op1.digits, op1.numberLength, op2.digits, op2.numberLength); op1.sign = resultSign; } else { int sign = unsignedArraysCompare (op1.digits, op2.digits, op1.numberLength, op2.numberLength); if (sign > 0) { subtract (op1.digits, op1.digits, op1.numberLength, op2.digits, op2.numberLength); // op1 = op1 - op2 // op1.sign remains equal } else { inverseSubtract (op1.digits, op1.digits, op1.numberLength, op2.digits, op2.numberLength); // op1 = op2 - op1 op1.sign = -op1.sign; } } op1.numberLength = Math.Max(op1.numberLength, op2.numberLength) + 1; op1.cutOffLeadingZeroes (); op1.unCache(); }