public void Add(BigInteger bi) {
AssertValid();
bi.AssertValid();
Debug.Assert((object)this != (object)bi);
int idx, cuMax, cuMin;
uint wCarry;
if ((cuMax = length) < (cuMin = bi.length)) {
cuMax = bi.length;
cuMin = length;
Ensure(cuMax + 1);
}
wCarry = 0;
for (idx = 0; idx < cuMin; idx++) {
if (0 != wCarry) {
wCarry = AddU(ref digits[idx], wCarry);
}
wCarry += AddU(ref digits[idx], bi.digits[idx]);
}
if (length < bi.length) {
for ( ; idx < cuMax; idx++) {
digits[idx] = bi.digits[idx];
if (0 != wCarry) {
wCarry = AddU(ref digits[idx], wCarry);
}
}
length = cuMax;
} else {
for ( ; 0 != wCarry && idx < cuMax; idx++) {
wCarry = AddU(ref digits[idx], wCarry);
}
}
if (0 != wCarry) {
Ensure(length + 1);
digits[length++] = wCarry;
}
AssertValid();
}