Пропустил шаг? Использование массивов (обязательных) для преобразования шестнадцатеричной строки в десятичную (Int)

Таким образом, каждый вариант, который я закодировал, продолжает возвращаться с 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 для соответствующего увеличения показателя степени.

Скажу сразу, можно, конечно String convertedToDecimal = new BigInteger(hex, 16);

g00se 08.04.2024 17:24
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
53
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Во всех версиях вашего кода (v1, v2 и v3) условие цикла — i > 0. Это означает, что цикл остановится, когда i станет равным 1, а затем он пропустит первый элемент в вашем hexArray (с индексом 0). ).

Просто измените условие цикла на следующее:

for (int i = hexArray.length - 1; i >= 0; i--)

Спасибо, я чувствую себя глупо. Просмотрел каждое несколько раз и подумал: ОК, моя логика ДОЛЖНА быть здравой, а что, если...

Skelefish 08.04.2024 17:25

@Skelefish Рад помочь. В вашем вопросе не нужно писать РЕШЕНО. Вы можете просто принять ответ, нажав кнопку рядом с ответом✔️

Feel free 08.04.2024 17:37

Цените это, это очень новичок в том, чтобы публиковать здесь сообщения, а не просто скрываться. :)

Skelefish 08.04.2024 18:04

Ваш подход разумен и является распространенным способом достижения цели (у всех есть некоторые вариации).

Умножая каждый этап окончательного ответа, вы можете неявно работать со степенью 16. Вот пример.

  • установить строку hexDigits
  • затем переберите шестнадцатеричное значение, которое нужно преобразовать, найдя индекс цифры.
  • преобразование в верхний регистр допускает оба регистра для шестнадцатеричных цифр (a-f)
  • вычислить итеративную сумму путем умножения на шестнадцатеричное основание 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.

Другие вопросы по теме

Элемент TS 7023 неявно имеет тип «любой», поскольку выражение типа «любой» не может использоваться для индексации типа «{}»
Как избежать «RuntimeWarning: деление на ноль, обнаруженное в log10» в цикле for с более чем 20 000 элементов?
Эффективный способ вернуть один элемент по приоритету в массиве объектов javascript
Группировка Json с одинаковым значением ключа с помощью Jolt
Как превратить динамически распределенный массив C в массив Numpy и вернуть его в Python в модуле расширения C
Распечатайте данные трехмерного массива в виде HTML-таблицы временных диапазонов в день
Почему повторяющиеся элементы в массиве SwiftUI вызывают предупреждение?
Почему выражение с запятой, используемое в качестве размера массива, должно быть заключено в круглые скобки, если оно является частью декларатора массива?
Эффективный способ найти сумму наибольших элементов x в подмассиве
Инициализируйте двумерный массив значениями, указанными в таблице ниже