public BigInteger ShiftRight(
int n)
{
if (n == 0)
return this;
if (n < 0)
return ShiftLeft(-n);
if (n >= BitLength)
return (this.sign < 0 ? One.Negate() : Zero);
// int[] res = (int[]) this.magnitude.Clone();
//
// ShiftRightInPlace(0, res, n);
//
// return new BigInteger(this.sign, res, true);
int resultLength = (BitLength - n + 31) >> 5;
int[] res = new int[resultLength];
int numInts = n >> 5;
int numBits = n & 31;
if (numBits == 0)
{
Array.Copy(this.magnitude, 0, res, 0, res.Length);
}
else
{
int numBits2 = 32 - numBits;
int magPos = this.magnitude.Length - 1 - numInts;
for (int i = resultLength - 1; i >= 0; --i)
{
res[i] = (int)((uint) this.magnitude[magPos--] >> numBits);
if (magPos >= 0)
{
res[i] |= this.magnitude[magPos] << numBits2;
}
}
}
Debug.Assert(res[0] != 0);
return new BigInteger(this.sign, res, false);
}