-1

我试图理解为什么 BigInteger 会引发溢出异常。我试图通过将 BigInteger 转换为 abyte[]并迭代地增加 shift 来可视化这一点,直到我看到异常发生的位置。

  • 我应该能够位移>>一个字节[],还是C#根本不能?

导致异常的代码

        uint amountToShift2 = 12;
        BigInteger num = new BigInteger(-126);
        uint  compactBitsRepresentation = (uint)(num >> (int)amountToShift2);
4

3 回答 3

1

关于您编辑的问题:

uint amountToShift2 = 12;
BigInteger num = new BigInteger(-126);
uint compactBitsRepresentation = (uint)(num >> (int)amountToShift2);

位移可以正常工作并产生一个BigInteger-1(负值)。

但是转换为uint抛出异常,因为-1超出了uint. BigInteger从to的转换uint不会“环绕” modulo 2**32,而是简单地抛出。

你可以通过以下方式解决这个问题:

uint compactBitsRepresentation = (uint)(int)(num >> (int)amountToShift2);

这不会抛出unchecked上下文(这是通常的上下文)。

于 2013-03-04T18:24:26.767 回答
0

C# 中的字节数组没有>><<移位运算符。您需要手动编写代码来执行此操作(注意脱落的位)。

于 2013-03-04T18:07:39.263 回答
0

有些事情告诉我,该>>运算符不适用于数组等引用类型,而是适用于原始类型。

int的 s 实际上是由一系列字节表示的,所以说

int i = 6;

i表示为

00000000000000000000000000000110

>>所有位向右移动,将其更改为

00000000000000000000000000000011

或者3


如果您确实需要移动字节数组,那么定义自己的方法将数组的所有项目移动到 1 个插槽上应该不会太难。不过,它将具有O(n)时间复杂度。

于 2013-03-04T18:07:43.007 回答