C# 大整数运算中2的显式幂

C# 大整数运算中2的显式幂,c#,vb.net,biginteger,integer-division,bit-shift,C#,Vb.net,Biginteger,Integer Division,Bit Shift,我有一段代码是这样的(vb.net或c#“语言”是无关紧要的): 由于我将其中的许多数字除以4,得到非常大的正整数(几百位数字),并且在收到一些“内存不足异常”后,我再次阅读了文档 在换档操纵器中,我可以看到: “不支持自定义运算符的语言可以通过相乘执行按位左移操作 按BigInteger.Pow(2,shift)计算的值。“ 因此,我认为上述代码可能会以这种方式进行改进(明确表示我除以2的幂): 我的问题 一般来说,显式使用biginger.Pow()是否有任何好处,以便(?)编译器知道它可

我有一段代码是这样的(vb.net或c#“语言”是无关紧要的):

由于我将其中的许多数字除以4,得到非常大的正整数(几百位数字),并且在收到一些“内存不足异常”后,我再次阅读了文档

在换档操纵器中,我可以看到: “不支持自定义运算符的语言可以通过相乘执行按位左移操作 按BigInteger.Pow(2,shift)计算的值。“

因此,我认为上述代码可能会以这种方式进行改进(明确表示我除以2的幂):

我的问题

  • 一般来说,显式使用biginger.Pow()是否有任何好处,以便(?)编译器知道它可以执行移位,而不是乘法/除法

  • 在我的特殊情况下,如果我需要将除法除以4,得到结果和余数,那么最好的方法是什么

一般来说,显式使用biginger.Pow()是否有任何好处,以便(?)编译器知道它可以执行移位,而不是乘法/除法

CIL(中间语言,即.NET语言后面的汇编代码)不支持
BigInteger
,因此编译器无法对其进行优化。(除非它特别支持
biginger
,以理解它可以用“右移两位”等替换“除以4”)

在我的特殊情况下,如果我需要将除法除以4,得到结果和余数,那么最好的方法是什么

您可以使用
序列获取余数,使用
>
序列执行除法,例如:

Dim Remainder as BigInteger = Serial And New BigInteger(3)
Serial = Serial >> 2
(注意:很抱歉可能出现语法错误,VB不是我的语言。)


然而,我不认为
OutOfMemoryException
的源代码是这些琐碎的操作。检查expection的堆栈跟踪,以了解它首先发生在哪里。

IIRC,
Pow
对负数的作用不同。谢谢Ondrej,这非常有趣。你能帮我了解一下如何得到剩下的吗?这是一种在移位前“抓取”两个位的方法吗?在二进制中,余数可以是00、01、10和11,用于四除。三在二进制中是11,所以和得到余数。如果您将商和余数保留在内存中,并且做得足够多,您可能仍然有内存不足的问题。@dbasnett谢谢。我想这是因为我们在前2位使用的是小endian格式。然而,我注意到,无论如何,移位都是在语言级别“向右”进行的,即使biginteger中的位实际上被向左移位(我认为)。Endianness完全是CPU中实现的问题。只要将给定的字节集解释为一个整数,它与按位运算无关。@Ondrej Yep,你是对的。谢谢你的指导性回答:-)
Dim Counter As BigInteger = 0
Serial = BigInteger.DivRem(Serial, BigInteger.Pow(2, 2), Counter)
CountersList.Add(CInt(Counter))
Dim Remainder as BigInteger = Serial And New BigInteger(3)
Serial = Serial >> 2