2015-12-23 2 views
3

У меня есть метод BigInteger, который принимает вход массива string[] из 4 чисел, преобразует числа в int[] и затем применяет к нему множество математических операций.Математические функции BigInteger, не возвращающие ожидаемые значения

public BigInteger convert32Bit(String[] array) 
{ 
    System.out.println("Array being converted is "+Arrays.toString(array)+"\n"); 
    int[] tempArray = new int[array.length]; 
    ArrayList<BigInteger> tempBigIntList = new ArrayList<BigInteger>(); 
    int i = 0; 
    for(String s:array) 
    { 
     int power = 4-i; 
     tempArray[i]= Integer.parseInt(s); 
     String string = Integer.toString(tempArray[0]); 
     BigInteger myBigInt = new BigInteger(string); 
     BigInteger num2 = myBigInt.multiply(new BigInteger("256").pow(power)); 
     System.out.println(tempArray[i]+" is being multiplied by 256^"+power+" which equals "+num2); 
     tempBigIntList.add(num2); 
     i++; 
    } 

    BigInteger bigInt32Bit = new BigInteger("0"); 
    for(BigInteger bI:tempBigIntList) 
    { 
     bigInt32Bit.add(bI); 
    } 

    System.out.println("\nThe final value is "+bigInt32Bit); 

    return bigInt32Bit; 
} 

Однако есть проблемы. Если я возьму массив "123", "0", "245", "23" в качестве входа. Я получаю следующий вывод.

Wrong output

Выход я ожидаю это

Array being converted is [123, 0, 245, 23] 

123 is being multiplied by 256^4 which equals 528280977408 
0 is being multiplied by 256^3 which equals 0 
245 is being multiplied by 256^2 which equals 16056320 
23 is being multiplied by 256^1 which equals 5888 

The final value is 528297039616 

Может кто-то пожалуйста, помогите исправить это?

+1

В вашей петле ваша строка 'String = Integer.toString (tempArray [0]);' должна быть 'tempArray [i]' – justhalf

+0

@justhalf Спасибо. Это определило проблему разработки значений – Dan

+0

Почему закрытые голоса? – Dan

ответ

3

Замените эту строку

bigInt32Bit.add(bI); 

с

bigInt32Bit = bigInt32Bit.add(bI); 

Вы делаете это потому, что BigInteger является immutable. Это означает, что вам нужно создать новое значение для bigInt32Bit вместо того, чтобы просто скорректировать старый. Кроме того (как @justhalf говорит) заменить строку

String string = Integer.toString(tempArray[0]); 

с

String string = Integer.toString(tempArray[i]); 

так, что вы используете правильное значение при применении математических операторов.

+1

Также в его коде есть опечатка, где 'String string = Integer .toString (tempArray [0]); 'должен быть' tempArray [i] 'вместо' tempArray [0] ' – justhalf

+1

@justhalf, спасибо. Сделал ответ сообщества wiki. –

+0

Спасибо вам обоим. Исправлены проблемы :) – Dan

0

BigInteger неизменен и, следовательно, bigInt32Bit.add(bI); приведет к ценности того, что у вас есть в первом элементе. Симметричные добавить все значения, которые вы могли бы сделать что-то вроде:

bigInt32Bit = bigInt32Bit.add(bI);//assign it 

Также вы просто проходящее самого первого элемент вашего массива в качестве входных данных BigInteger как String string = Integer.toString(tempArray[0]);, она должна быть String string = Integer.toString(tempArray[i]);. Я бы не использовал массив, если бы он нигде не использовался, вместо этого просто использовал бы целочисленную переменную.

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