2016-11-17 5 views
0

Я использую простую функцию для умножения больших целых чисел. Иногда к выводу добавляется еще один старший нулевой байт. Почему это случилось и как я могу это предотвратить?Ведущий ноль в умножении BigInteger

PS: а и б уже меньше, чем мод

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

Да, конечно. Я подготовил код, и вы можете посмотреть здесь [link] (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

 Смежные вопросы

  • Нет связанных вопросов^_^