public static BigInteger AddSameSign (BigInteger bi1, BigInteger bi2)
{
uint [] x, y;
uint yMax, xMax, i = 0;
// x should be bigger
if (bi1.length < bi2.length) {
x = bi2.data;
xMax = bi2.length;
y = bi1.data;
yMax = bi1.length;
} else {
x = bi1.data;
xMax = bi1.length;
y = bi2.data;
yMax = bi2.length;
}
BigInteger result = new BigInteger (Sign.Positive, xMax + 1);
uint [] r = result.data;
ulong sum = 0;
// Add common parts of both numbers
do {
sum = ((ulong)x [i]) + ((ulong)y [i]) + sum;
r [i] = (uint)sum;
sum >>= 32;
} while (++i < yMax);
// Copy remainder of longer number while carry propagation is required
bool carry = (sum != 0);
if (carry) {
if (i < xMax) {
do
carry = ((r [i] = x [i] + 1) == 0);
while (++i < xMax && carry);
}
if (carry) {
r [i] = 1;
result.length = ++i;
return result;
}
}
// Copy the rest
if (i < xMax) {
do
r [i] = x [i];
while (++i < xMax);
}
result.Normalize ();
return result;
}