public static Sign Compare (BigInteger bi1, BigInteger bi2)
{
//
// Step 1. Compare the lengths
//
uint l1 = bi1.length, l2 = bi2.length;
while (l1 > 0 && bi1.data [l1-1] == 0) l1--;
while (l2 > 0 && bi2.data [l2-1] == 0) l2--;
if (l1 == 0 && l2 == 0) return Sign.Zero;
// bi1 len < bi2 len
if (l1 < l2) return Sign.Negative;
// bi1 len > bi2 len
else if (l1 > l2) return Sign.Positive;
//
// Step 2. Compare the bits
//
uint pos = l1 - 1;
while (pos != 0 && bi1.data [pos] == bi2.data [pos]) pos--;
if (bi1.data [pos] < bi2.data [pos])
return Sign.Negative;
else if (bi1.data [pos] > bi2.data [pos])
return Sign.Positive;
else
return Sign.Zero;
}