Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ DivRem()

static unsafe void System.Number.BigInteger.DivRem ( ref BigInteger lhs,
ref BigInteger rhs,
out BigInteger quo,
out BigInteger rem )
inlinestatic

Definition at line 136 of file Number.cs.

137 {
138 if (lhs.IsZero())
139 {
140 SetZero(out quo);
141 SetZero(out rem);
142 return;
143 }
144 int length = lhs._length;
145 int length2 = rhs._length;
146 if (length == 1 && length2 == 1)
147 {
148 var (value, value2) = Math.DivRem(lhs._blocks[0], rhs._blocks[0]);
149 SetUInt32(out quo, value);
150 SetUInt32(out rem, value2);
151 return;
152 }
153 if (length2 == 1)
154 {
155 int num = length;
156 ulong right = rhs._blocks[0];
157 ulong num2 = 0uL;
158 for (int num3 = num - 1; num3 >= 0; num3--)
159 {
160 ulong left = (num2 << 32) | lhs._blocks[num3];
161 ulong num4;
162 (num4, num2) = Math.DivRem(left, right);
163 if (num4 == 0L && num3 == num - 1)
164 {
165 num--;
166 }
167 else
168 {
169 quo._blocks[num3] = (uint)num4;
170 }
171 }
172 quo._length = num;
173 SetUInt32(out rem, (uint)num2);
174 return;
175 }
176 if (length2 > length)
177 {
178 SetZero(out quo);
179 SetValue(out rem, ref lhs);
180 return;
181 }
182 int num5 = length - length2 + 1;
183 SetValue(out rem, ref lhs);
184 int num6 = length;
185 uint num7 = rhs._blocks[length2 - 1];
186 uint num8 = rhs._blocks[length2 - 2];
187 int num9 = BitOperations.LeadingZeroCount(num7);
188 int num10 = 32 - num9;
189 if (num9 > 0)
190 {
191 num7 = (num7 << num9) | (num8 >> num10);
192 num8 <<= num9;
193 if (length2 > 2)
194 {
195 num8 |= rhs._blocks[length2 - 3] >> num10;
196 }
197 }
198 for (int num11 = length; num11 >= length2; num11--)
199 {
200 int num12 = num11 - length2;
201 uint num13 = ((num11 < length) ? rem._blocks[num11] : 0u);
202 ulong num14 = ((ulong)num13 << 32) | rem._blocks[num11 - 1];
203 uint num15 = ((num11 > 1) ? rem._blocks[num11 - 2] : 0u);
204 if (num9 > 0)
205 {
206 num14 = (num14 << num9) | (num15 >> num10);
207 num15 <<= num9;
208 if (num11 > 2)
209 {
210 num15 |= rem._blocks[num11 - 3] >> num10;
211 }
212 }
213 ulong num16 = num14 / num7;
214 if (num16 > uint.MaxValue)
215 {
216 num16 = 4294967295uL;
217 }
218 while (DivideGuessTooBig(num16, num14, num15, num7, num8))
219 {
220 num16--;
221 }
222 if (num16 != 0)
223 {
224 uint num17 = SubtractDivisor(ref rem, num12, ref rhs, num16);
225 if (num17 != num13)
226 {
227 num17 = AddDivisor(ref rem, num12, ref rhs);
228 num16--;
229 }
230 }
231 if (num5 != 0)
232 {
233 if (num16 == 0L && num12 == num5 - 1)
234 {
235 num5--;
236 }
237 else
238 {
239 quo._blocks[num12] = (uint)num16;
240 }
241 }
242 if (num11 < num6)
243 {
244 num6--;
245 }
246 }
247 quo._length = num5;
248 for (int num18 = num6 - 1; num18 >= 0; num18--)
249 {
250 if (rem._blocks[num18] == 0)
251 {
252 num6--;
253 }
254 }
255 rem._length = num6;
256 }
static int LeadingZeroCount(uint value)
static bool DivideGuessTooBig(ulong q, ulong valHi, uint valLo, uint divHi, uint divLo)
Definition Number.cs:453
static void SetZero(out BigInteger result)
Definition Number.cs:620
static unsafe uint SubtractDivisor(ref BigInteger lhs, int lhsStartIndex, ref BigInteger rhs, ulong q)
Definition Number.cs:478
static unsafe void SetValue(out BigInteger result, ref BigInteger value)
Definition Number.cs:615
static unsafe uint AddDivisor(ref BigInteger lhs, int lhsStartIndex, ref BigInteger rhs)
Definition Number.cs:438
static unsafe void SetUInt32(out BigInteger result, uint value)
Definition Number.cs:592

References System.Number.BigInteger.AddDivisor(), System.Number.BigInteger.DivideGuessTooBig(), System.Math.DivRem(), System.L, System.Numerics.BitOperations.LeadingZeroCount(), System.length, System.length2, System.Number.BigInteger.SetUInt32(), System.Number.BigInteger.SetValue(), System.Number.BigInteger.SetZero(), System.Number.BigInteger.SubtractDivisor(), and System.value.

Referenced by System.Number.NumberToFloatingPointBitsSlow().