Большое отрицательное шестнадцатеричное значение преобразования в длинный в Java - PullRequest
0 голосов
/ 28 сентября 2011

результат должен иметь отрицательное значение, но положительный.

Как это можно исправить?

Спасибо !!

BigInteger b = новый BigInteger ("80000000000000004308000000000000", 16);

System.out.println ("длинное значение:" + b.longValue ());

-> длинное значение: 4830110600354856960

Ответы [ 3 ]

1 голос
/ 28 сентября 2011

Ваше строковое представление имеет длину со знаком, но представляется BigInteger в виде строки без знака (знак обозначается с помощью "-" в начале вашей строки).

Представление String состоит из необязательного знака минуса, за которым следует последовательность из одной или нескольких цифр в указанном основании.

Сдвиг битов или исправление вашей строки необходимы для того, чтобы сделать эту работу из экземпляра строки.

Я думаю, что лучший ответ - преобразовать вашу строку в байтовый массив и использовать BigInteger (byte [] val) , который распознает отрицательное или положительное число на основе дополнения до двух. Для этой строки в байтовый массив существует множество опций . Выбирай.

... ох, и ваш номер слишком велик, чтобы вписаться в длинный, так что это тоже будет проблемой; вы получите наименее значимые биты.

1 голос
/ 28 сентября 2011

http://download.oracle.com/javase/1,5,0/docs/api/java/math/BigInteger.html#longValue%28%29

См. Страницу выше, чтобы понять, почему она не будет отрицательной. Он возвращает младшие 64 бита, поэтому последние 64 бита должны быть больше, чем Long.MAX_VALUE, чтобы вызвать отрицательное значение.

0 голосов
/ 28 сентября 2011

Если у вас всегда есть 128-битные числа и вы предполагаете, что старшим битом является ваш знак, вы можете использовать следующие строки:

BigInteger neg = BigInteger.ONE.shiftLeft(127);
BigInteger b = new BigInteger("80000000000000004308000000000000", 16);
if(b.compareTo(neg) >= 0) { 
    b = neg.subtract(b); 
}

Примечание: b.longValue() будет уместно только в том случае, если число битов вписывается в длинное, что может не иметь места для таких больших чисел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...