-1

BigInteger がオーバーフロー例外をスローする理由を理解しようとしています。BigInteger を に変換しbyte[]、例外が発生する場所がわかるまでシフトを繰り返しインクリメントすることで、これを視覚化しようとしました。

  • ビットシフト >> a byte[] ができるはずですか、それとも 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、例外をスローします。からto への変換はmodulo を "ラップ アラウンド" するのではなく、単純にスローします。-1uintBigIntegeruint2**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 に答える