2016-11-17 77 views
0

我使用簡單函數來乘以大整數。有時會包含一個更多的前導零字節來輸出。爲什麼發生這種情況以及我如何預防它?BigInteger乘法中的前導零

PS:a和b已經比模

private byte[] multiply(final byte[] a, final byte[] b, final BigInteger mod) { 
    BigInteger M1 = new BigInteger(1, a); 
    BigInteger M2 = new BigInteger(1, b); 

    BigInteger out = M1.multiply(M2).mod(mod); 

    res = out.toByteArray(); 
} 
+1

可以給你的輸入的實施例和你看到作爲輸出的字節數組?或在ideone.com上的工作示例? – Tschallacka

+1

是的,當然。我準備的代碼,你可以看看這裏[鏈接](http://ideone.com/xKgCH6)m1 * m2返回無效的結果,m3 * m4產生正確的輸出。 @Tschallacka – Bob

+0

@Bob你需要在自己的問題中包含你的代碼(使用編輯按鈕)。 –

回答

4

如果(正)值具有從128到255

該字節的第一字節被添加額外的零字節少需要使得所得字節是具有至少一個符號位(https://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html#toByteArray%28%29

BigInteger.valueOf(5L).toByteArray() 

返回一個字節數組只有一個字節(5)。

BigInteger.valueOf(128L).toByteArray() 

返回只有兩個字節(0和128無符號表示形式)的字節數組。這是爲了區分

BigInteger.valueOf(-128L).toByteArray() 

其結果也返回與兩個字節(255,128中的無符號表示)

+0

酷!感謝您的好解釋。非常清楚! – Bob