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

◆ BigInteger() [9/12]

System.Numerics.BigInteger.BigInteger ( ReadOnlySpan< byte > value,
bool isUnsigned = false,
bool isBigEndian = false )
inline

Definition at line 288 of file BigInteger.cs.

289 {
290 int num = value.Length;
291 bool flag;
292 if (num > 0)
293 {
294 byte b = (isBigEndian ? value[0] : value[num - 1]);
295 flag = (b & 0x80u) != 0 && !isUnsigned;
296 if (b == 0)
297 {
298 if (isBigEndian)
299 {
300 int i;
301 for (i = 1; i < num && value[i] == 0; i++)
302 {
303 }
304 value = value.Slice(i);
305 num = value.Length;
306 }
307 else
308 {
309 num -= 2;
310 while (num >= 0 && value[num] == 0)
311 {
312 num--;
313 }
314 num++;
315 }
316 }
317 }
318 else
319 {
320 flag = false;
321 }
322 if (num == 0)
323 {
324 _sign = 0;
325 _bits = null;
326 return;
327 }
328 if (num <= 4)
329 {
330 _sign = (flag ? (-1) : 0);
331 if (isBigEndian)
332 {
333 for (int j = 0; j < num; j++)
334 {
335 _sign = (_sign << 8) | value[j];
336 }
337 }
338 else
339 {
340 for (int num2 = num - 1; num2 >= 0; num2--)
341 {
342 _sign = (_sign << 8) | value[num2];
343 }
344 }
345 _bits = null;
346 if (_sign < 0 && !flag)
347 {
348 _bits = new uint[1] { (uint)_sign };
349 _sign = 1;
350 }
351 if (_sign == int.MinValue)
352 {
353 this = s_bnMinInt;
354 }
355 return;
356 }
357 int num3 = num % 4;
358 int num4 = num / 4 + ((num3 != 0) ? 1 : 0);
359 uint[] array = new uint[num4];
360 int num5 = num - 1;
361 int k;
362 if (isBigEndian)
363 {
364 int num6 = num - 4;
365 for (k = 0; k < num4 - ((num3 != 0) ? 1 : 0); k++)
366 {
367 for (int l = 0; l < 4; l++)
368 {
369 byte b2 = value[num6];
370 array[k] = (array[k] << 8) | b2;
371 num6++;
372 }
373 num6 -= 8;
374 }
375 }
376 else
377 {
378 int num6 = 3;
379 for (k = 0; k < num4 - ((num3 != 0) ? 1 : 0); k++)
380 {
381 for (int m = 0; m < 4; m++)
382 {
383 byte b3 = value[num6];
384 array[k] = (array[k] << 8) | b3;
385 num6--;
386 }
387 num6 += 8;
388 }
389 }
390 if (num3 != 0)
391 {
392 if (flag)
393 {
394 array[num4 - 1] = uint.MaxValue;
395 }
396 if (isBigEndian)
397 {
398 for (int num6 = 0; num6 < num3; num6++)
399 {
400 byte b4 = value[num6];
401 array[k] = (array[k] << 8) | b4;
402 }
403 }
404 else
405 {
406 for (int num6 = num5; num6 >= num - num3; num6--)
407 {
408 byte b5 = value[num6];
409 array[k] = (array[k] << 8) | b5;
410 }
411 }
412 }
413 if (flag)
414 {
415 NumericsHelpers.DangerousMakeTwosComplement(array);
416 int num7 = array.Length - 1;
417 while (num7 >= 0 && array[num7] == 0)
418 {
419 num7--;
420 }
421 num7++;
422 if (num7 == 1)
423 {
424 switch (array[0])
425 {
426 case 1u:
427 this = s_bnMinusOneInt;
428 return;
429 case 2147483648u:
430 this = s_bnMinInt;
431 return;
432 }
433 if ((int)array[0] > 0)
434 {
435 _sign = -1 * (int)array[0];
436 _bits = null;
437 return;
438 }
439 }
440 if (num7 != array.Length)
441 {
442 _sign = -1;
443 _bits = new uint[num7];
444 Array.Copy(array, _bits, num7);
445 }
446 else
447 {
448 _sign = -1;
449 _bits = array;
450 }
451 }
452 else
453 {
454 _sign = 1;
455 _bits = array;
456 }
457 }
static readonly BigInteger s_bnMinusOneInt
Definition BigInteger.cs:28
readonly uint[] _bits
Definition BigInteger.cs:20
static readonly BigInteger s_bnMinInt
Definition BigInteger.cs:22

References System.Numerics.BigInteger._bits, System.Numerics.BigInteger._sign, System.array, System.Array.Copy(), System.Numerics.NumericsHelpers.DangerousMakeTwosComplement(), System.Numerics.BigInteger.s_bnMinInt, System.Numerics.BigInteger.s_bnMinusOneInt, and System.value.