Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Net中的Int128?_C#_.net_Int128 - Fatal编程技术网

C# Net中的Int128?

C# Net中的Int128?,c#,.net,int128,C#,.net,Int128,我需要做一些大整数运算。是否存在表示128位整数并实现所有常用运算符的类或结构 顺便说一句,我意识到十进制可以用来表示96位的整数。不,在.NET中没有任何东西我相信Mono有一个大整数实现,您应该能够找到它的源代码。它在这里。“BigInteger类型是一种不可变类型,表示一个任意大的整数,其值在理论上没有上限或下限。” 如果您不介意引用J#库(默认情况下,VS中包含vjslib.dll),那么在.NET中已经存在和实现了BigInteger using java.math; public

我需要做一些大整数运算。是否存在表示128位整数并实现所有常用运算符的类或结构


顺便说一句,我意识到十进制可以用来表示96位的整数。

不,在.NET中没有任何东西我相信Mono有一个大整数实现,您应该能够找到它的源代码。

它在这里。“BigInteger类型是一种不可变类型,表示一个任意大的整数,其值在理论上没有上限或下限。”


如果您不介意引用J#库(默认情况下,VS中包含vjslib.dll),那么在.NET中已经存在和实现了BigInteger

using java.math;

public static void Main(){
    BigInteger biggy = new BigInteger(....)

}

BigInteger现在是.NET4.0中C#和friends的标准部分。请参阅:。 请注意,CPU通常可以更快地以恒定时间处理普通整数,尤其是在使用常用数学运算符(+、-、/、…)时,因为这些运算符通常直接映射到单个CPU指令

对于BigInteger,即使是最基本的数学操作,对运行时随数字大小变化的方法的函数调用也要慢得多。这是因为BigInteger实现了任意精度的算法,这增加了相当大但必要的开销。 好处是大整数不限于64位甚至128位,而是由可用的系统内存(或大约2^64位精度,以先到者为准)决定。 阅读。

C#PCL库,用于计算大数值,如Int128和Int256。
虽然
biginger
是大多数应用程序的最佳解决方案,但如果您有性能关键型数值计算,则可以使用我的库中完整的
Int128
UInt128
实现。如果
Int64
UInt64
太小,但
biginger
太慢,则这些类型非常有用。

GUID由.NET framework中的128位整数支持;尽管它没有任何典型的整数类型方法

我以前为GUID编写过一个处理程序,将其视为128位整数,但这是为我8年前工作过的一家公司编写的。我再也无法访问源代码了


因此,如果您需要对128位整数的本机支持,并且不想出于任何原因依赖BigInteger,您可能会攻击GUID以满足您的目的。

出于好奇,为什么需要使用如此大的数字?请注意,本机未签名int128是IPv6地址的自然表示形式,增加了这个问题的紧迫性和相关性,在C++中有一个问题,它更详细地讨论,具体地说如何模拟It128加法和减法OK,所以一个大整数满足了这个需求,但它不是一个It128类型,它堆堆分配(很多,每操作),并运行32位字,这样做会有开销,虽然它支持任意范围,但如果我知道我真的需要Int128类型,我就不会使用它。我认为人们已经使用较小的整数来模拟较大的整数有一段时间了(由于各种硬件限制),要找到合适的C代码并加以调整应该不难。我的观点是,BigInteger是一般情况下的解决方案,而不是Int128。仅供参考:BigInteger不适用于.NET 2Biginger≠ INT128如果您在追求性能,请使用两个qwords(
long
)而不是biginteger。它实际上已经存在,现在仍然存在。@DrewNoakes:的确-可惜BigDecimal仍然被截断:(@markshep:同意,尽管我认为在几乎所有答案中添加复制/粘贴注释实际上不是一个好主意。但是对于想要处理大整数的人来说,
biginger
可能是最好的解决方案。当然,需要额外的工作才能使其像Int128一样溢出。@markshep:我意识到,但是BigInteger满足了要求,
我需要做一些大整数运算。
我想我的错误在于没有提到它满足了要求,
实现了所有常用的运算符“
。我编辑了答案以反映这一点,并添加了一些关于任意精度运算的注释。你所说的”是什么意思请注意,BigInteger不支持常用的运算符"?@AluanHaddad:我的意思是BigInteger运算符被重载,不仅仅是CPU指令的简单1:1映射,这一点很清楚,所以我重写了这篇文章的这一部分。这最准确地回答了这个问题,而且非常有用。您的uint128有四个ulong字段,导致它使用32字节。为什么它需要两个额外的ulong?不,它有两个ulong字段。某些操作(如模乘)需要256位精度的中间结果,因此UInt256的表示也是必要的。该私有类型确实(并且必须)有有四个ulong字段。这对于存储来说是可以的,但如果我想加、减、乘等,我可能会更好地使用其他内容进行更正。我们将其用作位掩码(将数据库中的列从64位更新为guid),所以存储就是我们所需要的。功能改进的时间限制导致了这个黑客解决方案。不幸的是,它在乘法过程中执行了一些堆分配。
using java.math;

public static void Main(){
    BigInteger biggy = new BigInteger(....)

}