Csharp/C#教程:BigInteger如何在内部存储值?分享


BigInteger如何在内部存储值?

BigInteger类有一个返回字节数组的方法。 这是否表明该类在内部使用字节数组以存储数字?

知道这一点非常重要,以便选择正确的数据类型来操作二进制数据。 例如,如果类使用Int64数组,那么类似的数组可以更有效地通过任何调用函数来操作原始数据。

作为一个例子,我调用ToByteArray方法来遍历寻找特定二进制模式的字节。

根据参考源,它似乎将其信息存储为数据的uint[]和符号的int。

 namespace System.Numerics { /// Represents an arbitrarily large signed integer. [Serializable] public struct BigInteger : IFormattable, IComparable, IComparable, IEquatable { // For values int.MinValue < n <= int.MaxValue, the value is stored in sign // and _bits is null. For all other values, sign is +1 or -1 and the bits are in _bits internal int _sign; internal uint[] _bits; 

以下是执行ToByteArray()的代码

上述就是C#学习教程:BigInteger如何在内部存储值?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

  // Return the value of this BigInteger as a little-endian twos-complement // byte array, using the fewest number of bytes possible. If the value is zero, // return an array of one byte whose element is 0x00. public byte[] ToByteArray() { if (_bits == null && _sign == 0) return new byte[] { 0 }; // We could probably make this more efficient by eliminating one of the passes. // The current code does one pass for uint array -> byte array conversion, // and then another pass to remove unneeded bytes at the top of the array. uint[] dwords; byte highByte; if (_bits == null) { dwords = new uint[] { (uint)_sign }; highByte = (byte)((_sign < 0) ? 0xff : 0x00); } else if(_sign == -1) { dwords = (uint[])_bits.Clone(); NumericsHelpers.DangerousMakeTwosComplement(dwords); // mutates dwords highByte = 0xff; } else { dwords = _bits; highByte = 0x00; } byte[] bytes = new byte[checked(4 * dwords.Length)]; int curByte = 0; uint dword; for (int i = 0; i < dwords.Length; i++) { dword = dwords[i]; for (int j = 0; j < 4; j++) { bytes[curByte++] = (byte)(dword & 0xff); dword >>= 8; } } // find highest significant byte int msb; for (msb = bytes.Length - 1; msb > 0; msb--) { if (bytes[msb] != highByte) break; } // ensure high bit is 0 if positive, 1 if negative bool needExtraByte = (bytes[msb] & 0x80) != (highByte & 0x80); byte[] trimmedBytes = new byte[msb + 1 + (needExtraByte ? 1 : 0)]; Array.Copy(bytes, trimmedBytes, msb + 1); if (needExtraByte) trimmedBytes[trimmedBytes.Length - 1] = highByte; return trimmedBytes; } 

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1014533.html

(0)
上一篇 2021年12月30日
下一篇 2021年12月30日

精彩推荐