我需要做一些大整数数学。是否有任何表示 128 位整数并实现所有常用运算符的类或结构?
顺便说一句,我意识到可以使用十进制来表示 96 位整数。
它在System.Numerics中。“BigInteger 类型是一种不可变类型,它表示一个任意大的整数,其值在理论上没有上限或下限。”
var i = System.Numerics.BigInteger.Parse("10000000000000000000000000000000");
虽然BigInteger
是大多数应用程序的最佳解决方案,但如果您有性能关键的数值计算,您可以使用我的Dirichlet.Numerics库中的完整Int128
和UInt128
实现。如果并且太小但太慢,这些类型很有用。Int64
UInt64
BigInteger
不,.NET <= 3.5 中什么都没有。我希望/期待BigInteger将在 .NET 4.0 中回归。(它是从 .NET 3.5 中删除的。)
BigInteger 现在是 C# 和 .NET 4.0 中的朋友的标准部分。请参阅:Gunnar Peipman 的 ASP.NET 博客。请注意,CPU 通常可以更快地在恒定时间内处理普通整数,尤其是在使用通常的数学运算符(+、-、/、...)时,因为这些运算符通常直接映射到单个 CPU 指令。
使用 BigInteger,即使是最基本的数学运算也是对运行时间随数字大小而变化的方法的函数调用要慢得多。这是因为 BigInteger 实现了任意精度的算法,这增加了相当大但必要的开销。好处是 BigIntegers 不限于 64 甚至 128 位,而是由可用的系统内存(或大约 2^64 位精度,以先到者为准)。在这里阅读。
如果您不介意参考 J# 库(vjslib.dll 默认包含在 VS 中),那么 BigInteger 已经在 .NET 中实现了
using java.math;
public static void Main(){
BigInteger biggy = new BigInteger(....)
}
C# PCL 库,用于计算大数,例如 Int128 和 Int256。 https://github.com/everbytes/BigMath
GUID 由 .NET 框架中的 128 位整数支持;尽管它没有任何典型的整数类型方法。
我之前为 GUID 编写了一个处理程序,将其视为 128 位整数,但这是为我在大约 8 年前工作的一家公司准备的。我不再有权访问源代码。
因此,如果您需要对 128 位整数的本机支持,并且出于任何原因不想依赖 BigInteger,您可能会破解 GUID 来满足您的目的。
我相信 Mono 有一个 BigInteger 实现,您应该能够追踪其来源。