2016-11-17 2 views
0

J'utilise une fonction simple pour multiplier les grands entiers. Parfois, un autre octet de tête zéro est inclus dans la sortie. Pourquoi est-ce arrivé et comment je peux l'empêcher?Numéro zéro dans la multiplication de BigInteger

PS: a et b sont déjà moins de mod

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

pouvez-vous donner des exemples de vos entrées et ce que vous voyez en sortie? ou un exemple de travail sur ideone.com? – Tschallacka

+1

Oui, bien sûr. J'ai préparé le code et vous pouvez jeter un oeil ici [link] (http://ideone.com/xKgCH6) m1 * m2 retour résultat invalide, m3 * m4 produire une sortie correcte. @Tschallacka – Bob

+0

@Bob vous devez inclure votre code dans votre question elle-même (en utilisant le bouton d'édition). –

Répondre

4

Le zéro octet supplémentaire est ajouté si la valeur (positive) a un premier octet qui est de 128 à 255.

Cet octet est nécessaire pour que l'octet résultant sont comporte au moins un bit de signe (https://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html#toByteArray%28%29)

BigInteger.valueOf(5L).toByteArray() 

renvoie un tableau d'octets avec un seul octet (5).

BigInteger.valueOf(128L).toByteArray() 

renvoie un tableau d'octets avec seulement deux octets (0 et 128 dans la représentation non signée). Cela permet de distinguer le résultat de

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

qui retourne également un tableau d'octets avec deux octets (255, 128 dans la représentation non signée)

+0

Cool! Merci pour la bonne explication. Très clair! – Bob