我有一段代码(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,得到结果和余数,最好的方法是什么?
答案 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
的来源是这些微不足道的操作。检查预期的堆栈轨迹,以了解它在第一时间发生的位置。