BigInteger.singleByteDivide C# (CSharp) Method

singleByteDivide() private static method

private static singleByteDivide ( BigInteger bi1, BigInteger bi2, BigInteger outQuotient, BigInteger outRemainder ) : void
bi1 BigInteger
bi2 BigInteger
outQuotient BigInteger
outRemainder BigInteger
return void
        private static void singleByteDivide(BigInteger bi1, BigInteger bi2,
                                             BigInteger outQuotient, BigInteger outRemainder)
        {
                uint[] result = new uint[maxLength];
                int resultPos = 0;

                // copy dividend to reminder
                for(int i = 0; i < maxLength; i++)
                        outRemainder.data[i] = bi1.data[i];
                outRemainder.dataLength = bi1.dataLength;

                while(outRemainder.dataLength > 1 && outRemainder.data[outRemainder.dataLength-1] == 0)
                        outRemainder.dataLength--;

                ulong divisor = (ulong)bi2.data[0];
                int pos = outRemainder.dataLength - 1;
                ulong dividend = (ulong)outRemainder.data[pos];

                //Console.WriteLine("divisor = " + divisor + " dividend = " + dividend);
                //Console.WriteLine("divisor = " + bi2 + "\ndividend = " + bi1);

                if(dividend >= divisor)
                {
                        ulong quotient = dividend / divisor;
                        result[resultPos++] = (uint)quotient;

                        outRemainder.data[pos] = (uint)(dividend % divisor);
                }
                pos--;

                while(pos >= 0)
                {
                        //Console.WriteLine(pos);

                        dividend = ((ulong)outRemainder.data[pos+1] << 32) + (ulong)outRemainder.data[pos];
                        ulong quotient = dividend / divisor;
                        result[resultPos++] = (uint)quotient;

                        outRemainder.data[pos+1] = 0;
                        outRemainder.data[pos--] = (uint)(dividend % divisor);
                        //Console.WriteLine(">>>> " + bi1);
                }

                outQuotient.dataLength = resultPos;
                int j = 0;
                for(int i = outQuotient.dataLength - 1; i >= 0; i--, j++)
                        outQuotient.data[j] = result[i];
                for(; j < maxLength; j++)
                        outQuotient.data[j] = 0;

                while(outQuotient.dataLength > 1 && outQuotient.data[outQuotient.dataLength-1] == 0)
                        outQuotient.dataLength--;

                if(outQuotient.dataLength == 0)
                        outQuotient.dataLength = 1;

                while(outRemainder.dataLength > 1 && outRemainder.data[outRemainder.dataLength-1] == 0)
                        outRemainder.dataLength--;
        }