我应该能够移位>>一个字节数组?

时间:2013-03-04 17:58:46

标签: c# bytearray biginteger bit-shift overflowexception

我试图理解为什么BigInteger会抛出溢出异常。我试图通过将BigInteger转换为byte[]并迭代地递增移位直到我看到异常发生的位置来将其可视化。

  • 我应该能够移位>>一个byte [],或者C#根本无法做到?

导致异常的代码

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

3 个答案:

答案 0 :(得分:1)

关于您编辑过的问题:

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

位移正常并产生BigInteger-1(负值)。

但转换为uint会引发异常,因为-1超出uint的范围。从BigIntegeruint的转换并非“模糊”模2**32,而只是抛出。

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

有些东西告诉我>>运算符不能使用数组之类的引用类型,而是使用基本类型。

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

int i = 6;

i表示为

00000000000000000000000000000110

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

00000000000000000000000000000011

3


如果你真的需要移动字节数组,那么定义你自己的方法来移动数组的所有项目并不是非常困难。它会有 O(n)时间复杂度。