2016-11-17 79 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