Таким образом, каждый вариант, который я закодировал, продолжает возвращаться с 0 или 1 независимо от того, что я ввожу. Извините за длину/неэффективность, просто пытаюсь заставить это работать.
v1 - тесты if/else
System.out.println("Enter a hexadecimal String to convert to decimal (base_10)");
while(true)
{
System.out.print("Hexadecimal >> ");
String hex = scan.nextLine();
String hexArray[] = hex.split("");
//int hexNum[] = new int[hexArray.length];
//System.out.println(Arrays.toString(hexArray)); //test
int sum = 0;
int exp = 0;
for (int i = hexArray.length-1; i > 0; i--)
{
if (hexArray[i].equalsIgnoreCase("A"))
sum += 10 * Math.pow(16,exp);
else if (hexArray[i].equalsIgnoreCase("B"))
sum += 11 * Math.pow(16,exp);
else if (hexArray[i].equalsIgnoreCase("C"))
sum += 12 * Math.pow(16,exp);
else if (hexArray[i].equalsIgnoreCase("D"))
sum += 13 * Math.pow(16,exp);
else if (hexArray[i].equalsIgnoreCase("E"))
sum += 14 * Math.pow(16,exp);
else if (hexArray[i].equalsIgnoreCase("F"))
sum += 15 * Math.pow(16,exp);
else
sum += (Integer.parseInt(hexArray[i]) * Math.pow(16,exp));
exp++;
}
System.out.println("\nHexadecimal: " + hex + "\t Decimal: " + sum);
}
Альтернативно... v2 — переключение по строке
System.out.println("Enter a hexadecimal String to convert to decimal (base_10)");
while(true)
{
System.out.print("Hexadecimal >> ");
String hex = scan.nextLine();
String[] hexArray = hex.split("");
System.out.println(Arrays.toString(hexArray)); //test
int sum = 0;
int exp = 0;
for (int i = hexArray.length-1; i > 0; i--)
{
String s = hexArray[i];
switch(s)
{
case "A": case "a":
sum += (10 * Math.pow(16,exp));
break;
case "B": case "b":
sum += (11 * Math.pow(16,exp));
break;
case "C": case "c":
sum += (12 * Math.pow(16,exp));
break;
case "D": case "d":
sum += (13 * Math.pow(16,exp));
break;
case "E": case "e":
sum += (14 * Math.pow(16,exp));
break;
case "F": case "f":
System.out.println("hi");
sum += (15 * Math.pow(16,exp));
break;
default: //i.e. NUMBERS
sum += ((Integer.parseInt(hexArray[i]) * Math.pow(16,exp)));
}
exp++;
}
System.out.println("\nHexadecimal: " + hex + "\t Decimal: " + sum);
System.out.println("\n");
}
v3 — переключение с помощью символьных литералов
System.out.println("Enter a hexadecimal String to convert to decimal (base_10)");
while(true)
{
System.out.print("Hexadecimal >> ");
String hex = scan.nextLine();
String[] hexArray = hex.split("");
System.out.println(Arrays.toString(hexArray)); //test
int sum = 0;
int exp = 0;
for (int i = hexArray.length-1; i > 0; i--)
{
char c = hexArray[i].charAt(0);
switch(c)
{
case '0':
break;
case '1':
sum += Math.pow(16,exp);
break;
case '2':
sum += 2 * Math.pow(16,exp);
break;
case '3':
sum += 3 * Math.pow(16,exp);
break;
case '4':
sum += 4 * Math.pow(16,exp);
break;
case '5':
sum += 5 * Math.pow(16,exp);
break;
case '6':
sum += 6 * Math.pow(16,exp);
break;
case '7':
sum += 7 * Math.pow(16,exp);
break;
case '8':
sum += 8 * Math.pow(16,exp);
break;
case '9':
sum += 9 * Math.pow(16,exp);
break;
case 'A':
case 'a':
sum += 10 * Math.pow(16,exp);
break;
case 'B':
case 'b':
sum += 11 * Math.pow(16,exp);
break;
case 'C':
case 'c':
sum += 12 * Math.pow(16,exp);
break;
case 'D':
case 'd':
sum += 13 * Math.pow(16,exp);
break;
case 'E':
case 'e':
sum += 14 * Math.pow(16,exp);
break;
case 'F':
case 'f':
sum += 15 * Math.pow(16,exp);
break;
default:
; //Invalid Character
}
exp++;
}
System.out.println("\nHexadecimal: " + hex + "\t Decimal: " + sum);
Несколько способов (показано выше), но сначала разбивают его на массив и читают назад R->L для соответствующего увеличения показателя степени.
Во всех версиях вашего кода (v1, v2 и v3) условие цикла — i > 0. Это означает, что цикл остановится, когда i станет равным 1, а затем он пропустит первый элемент в вашем hexArray (с индексом 0). ).
Просто измените условие цикла на следующее:
for (int i = hexArray.length - 1; i >= 0; i--)
Спасибо, я чувствую себя глупо. Просмотрел каждое несколько раз и подумал: ОК, моя логика ДОЛЖНА быть здравой, а что, если...
@Skelefish Рад помочь. В вашем вопросе не нужно писать РЕШЕНО. Вы можете просто принять ответ, нажав кнопку рядом с ответом✔️
Цените это, это очень новичок в том, чтобы публиковать здесь сообщения, а не просто скрываться. :)
Ваш подход разумен и является распространенным способом достижения цели (у всех есть некоторые вариации).
Умножая каждый этап окончательного ответа, вы можете неявно работать со степенью 16. Вот пример.
String hexDigits = "0123456789ABCDEF";
String hexValue = "12FFA";
long decimal = 0;
for (char hexDigit : hexValue.toCharArray()) {
decimal = decimal * 16 + hexDigits.indexOf(Character.toUpperCase(hexDigit));
}
System.out.println(decimal);
принты
77818
Вот как это работает
decimal = 0
decimal = decimal * 16 + 1 ( decimal = 0 + 1 = 1)
decimal = decimal * 16 + 2 ( decimal = 16 + 2 = 18)
decimal = decimal * 16 + 15 ( decimal = 288 + 15 = 303)
decimal = decimal * 16 + 15 ( decimal = 4848 + 15 = 4863)
decimal = decimal * 16 + 10 ( decimal = 4863 + 10 = 77818)
Обратите внимание, что я использую длинный ответ. Максимальное значение длинного номера в шестнадцатеричном формате равно 7FFFFFFFFFFFFFFF
.
Скажу сразу, можно, конечно
String convertedToDecimal = new BigInteger(hex, 16);