在biginteger操作中明确的2次幂

时间:2014-04-07 08:37:55

标签: c# vb.net biginteger integer-division bit-shift

我有一段代码(vb.net或c#"语言"无关紧要):

 Dim Counter As BigInteger = 0
 Serial = BigInteger.DivRem(Serial, 4, Counter)
 CountersList.Add(CInt(Counter))

由于我将这些除法中的许多除以4,具有非常大的正整数(几百个数字),并且在收到一些"内存异常"之后,我又去了另外阅读文档

在班次操作员page中,我可以阅读: "不支持自定义运算符的语言可以通过乘法执行按位左移运算 值由BigInteger.Pow(2,shift)。"

所以我觉得上面的代码可能会改进这种方式(明确地说我除以2的幂):

Dim Counter As BigInteger = 0
Serial = BigInteger.DivRem(Serial, BigInteger.Pow(2, 2), Counter)
CountersList.Add(CInt(Counter))

我的问题。

  • 一般情况下,显式使用BigInteger.Pow()是否有任何优势,因此编译器可能知道(?)它可以执行移位而不是乘法/除法?

  • 在我的具体案例中,我需要将除法除以4,得到结果和余数,最好的方法是什么?

1 个答案:

答案 0 :(得分:1)

  

一般来说,显式使用BigInteger.Pow()是否有任何优势,因此编译器可能知道(?)它可以执行移位而不是乘法/除法?

在CIL中不支持BigInteger(中间语言,即汇编代码,在.NET语言之后),所以不,编译器无法对其进行优化。 (除非它对BigInteger有一些非常具体的支持,以这种方式理解它可以用“向右移两位”等替换“除以4”。)

  

在我的具体案例中,我需要将除法除以4,得到结果和余数,最好的方法是什么?

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

Dim Remainder as BigInteger = Serial And New BigInteger(3)
Serial = Serial >> 2

(注意:很抱歉可能存在语法错误,VB不是我的语言。)

但是,我不认为OutOfMemoryException的来源是这些微不足道的操作。检查预期的堆栈轨迹,以了解它在第一时间发生的位置。