Я немного изменил ваш код.
a.В вашем коде был напечатан только первый гекс.
Изменение:
- вызовите hexToBinary для каждой шестнадцатеричной строки.
b.двоичное значение было отброшено после печати, поэтому его нельзя было использовать повторно.
Изменение:
Изменен тип возвращаемого значения hexToBinary с void на String и возвращено вычисленное двоичное значение.
Чтобы иметь возможность вернуть строку, я добавляю миры (кусочки) шестнадцатеричного / двоичного кода в строку в каждом предложении switch (case). (Stringbuilder может быть лучше, чемa String - вы можете дополнительно улучшить это)
в основном: дополнительно собрать все возвращенные двоичные значения в массив, называемый «binaryValues», чтобы иметь их для следующего шага.
С вышеуказанными (небольшими) изменениями у меня теперь есть все двоичные значения, которые уже были вычислены.
Так что я могу просто использовать их в методе binaryToDecimal, которыйпросто суммирует двоичные значения, взвешенные по их положению.
Почему бы не сделать это снова?Потому что вам нужно конвертировать AF в числа, что уже сделал ваш hexToBinary.Таким образом, сохранение значений спасет вас от повторения этого шага.У меня есть ощущение, что именно это имел в виду ваш учитель, когда он / она совмещал такие задачи следующим образом.
Получившийся код выглядит так:
import java.io.*;
import java.util.Scanner;
import java.util.ArrayList;
public class Main
{
static String hexToBinary(char hexdec[]) {
String hex = "";
for (char c : hexdec) {
switch (c) {
case '0':
System.out.print("0000");
hex += "0000";
break;
case '1':
System.out.print("0001");
hex += "0001";
break;
case '2':
System.out.print("0010");
hex += "0010";
break;
case '3':
System.out.print("0011");
hex += "0011";
break;
case '4':
System.out.print("0100");
hex += "0100";
break;
case '5':
System.out.print("0101");
hex += "0101";
break;
case '6':
System.out.print("0110");
hex += "0110";
break;
case '7':
System.out.print("0111");
hex += "0111";
break;
case '8':
System.out.print("1000");
hex += "1000";
break;
case '9':
System.out.print("1001");
hex += "1001";
break;
case 'A':
System.out.print("1010");
hex += "1110";
break;
case 'B':
System.out.print("1011");
hex += "1111";
break;
case 'C':
System.out.print("1100");
hex += "1100";
break;
case 'D':
System.out.print("1101");
hex += "1110";
break;
case 'E':
System.out.print("1110");
hex += "1110";
break;
case 'F':
hex += "1111";
System.out.print("1111");
break;
default:
System.out.print("\nInvalid hexadecimal digit " + hexdec[c]);
}
}
System.out.println();
return hex;
}
public static int binaryToDecimal(String binary) {
int decimal = 0;
for (int i = 1; i < binary.length()-1; i++) {
decimal += Math.pow(2, i-1) * (binary.charAt(binary.length()-i) - '0');
}
return decimal;
}
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(new File("RAMerrors8x4c"));
ArrayList<String> hexValues = new ArrayList<>();
ArrayList<String> binaryValues = new ArrayList<>();
while (sc.hasNext()) {
hexValues.add(sc.nextLine());
}
for (String hex : hexValues) {
String binary = hexToBinary(hex.toCharArray());
binaryValues.add(binary);
System.out.println(binary);
}
for (String binary : binaryValues) {
int decimal = binaryToDecimal(binary);
System.out.println(decimal);
}
}
}
}
Помимо использования Stringbuilder, может возникнуть другая идея.сделать всю печать двоичных значений в основном.HexToBinary возвращает строку - так что вы можете напечатать ее в цикле - если хотите.