2013-03-04 61 views
-1

我想了解爲什麼BigInteger引發溢出異常。我試圖通過將BigInteger轉換爲byte[]並反覆增加移位直到我看到發生異常的位置來想象這一點。我應該能夠位移>>一個字節數組嗎?

  • 我應該能夠移位>>一個字節[],還是C#根本無法?

代碼引起異常

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

你不能移位一個字節[],但你不會得到一個異常;它根本不會編譯。你在做什麼是移位一個BigInteger – 2013-03-04 18:05:02

+0

哪裏有'num'和'amountToShift2'聲明?你可以發佈[SSCCE](sscce.org),以便我們可以複製和粘貼你的代碼? – 2013-03-04 18:05:06

+0

@SamIAm - 更新了SSCE。除了對System.Numerics的引用外,你只需要這麼做。 – LamonteCristo 2013-03-04 18:12:02

回答

1

關於與編輯後的問題:

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

的移位工程確定和產生的價值-1(負一層)一BigInteger

但是轉換爲uint會引發異常,因爲-1超出uint的範圍。從BigIntegeruint的轉換不會「繞回」模2**32,而只是拋出。

讓您可以與:

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

,不會在unchecked背景下拋出(這是通常的情況下)。

0

沒有>><<比特移位運算符在C#字節數組。您需要手動編寫代碼才能這樣做(注意掉落的部分)。

+0

此代碼與byte [] – 2013-03-04 18:26:23

+0

@PeterRitchie無關你是否知道,當這些答案寫成時,問題就完全不同了? – 2013-03-04 18:37:32

+0

@JeppeStigNielsen不,我不知道;但我不確定這會如何改變。如果答案不能反映問題,那麼答案也應該被修改或刪除。爲什麼要讓這個問題更混亂? – 2013-03-04 18:47:44

0

有些東西告訴我,>>運算符不能像數組一樣使用引用類型,而是它適用於基本類型。

int s的實際上是由一系列的字節數來表示,所以說

int i = 6;

i>>轉變表示爲

00000000000000000000000000000110 

所有位的權利,改變它到

00000000000000000000000000000011 

3


如果你真的需要字節數組轉移,它不應該太太難定義自己的方法來移動陣列的所有項目超過1個插槽。儘管如此,它將具有O(n)時間複雜度。

+0

運算符>>適用於BigInteger。例如http://msdn.microsoft.com/en-us/library/system.numerics.biginteger.op_rightshift.aspx – 2013-03-04 18:25:57

+0

請注意,他編輯的問題現在顯示「BigInteger」的成功移位,然後是不成功的轉換(轉換)從「BigInteger」到「uint」。看到我的答案。 – 2013-03-04 18:27:43

相關問題