2013-09-13 6 views
0

первое сообщение здесь. У меня есть задание преобразовать из шестнадцатеричного в десятичное, в том числе и другие преобразования, но у меня есть одна проблема ...Проблема с шестнадцатеричным преобразованием в десятичную деление

Так что шестнадцатеричные значения, которые мне нужно преобразовать, - 12345678, 2A3DF8A7, 00FF00FF. 00FF00FF отлично работает, это числовые значения, которые дают мне проблемы.

Я знаю, что вы должны умножить цифру на 16^n, но по какой-то причине я получаю значения, которые слишком высоки, хотя я думаю, что делаю это правильно. Очевидно, нет, потому что он не работает. Помощь будет принята с благодарностью!

Мой код изменился в течение последнего часа, возившись с ним, но это последняя «еще», теперь проблема.

public void toDec() 
{ 
    dec = 0; 
    for (int j = 0, i = 7; j < hex.length(); j++){ 

     if (hex.charAt(j) == 'A') { 
      dec += (10 * (int)Math.pow(16, i)); 
     } 
     else if (hex.charAt(j) == 'B') { 
      dec += (11 * (int)Math.pow(16, i)); 
     } 
     else if (hex.charAt(j) == 'C') { 
      dec += (12 * (int)Math.pow(16, i)); 
     } 
     else if (hex.charAt(j) == 'D') { 
      dec += (13 * (int)Math.pow(16, i)); 
     } 
     else if (hex.charAt(j) == 'E') { 
      dec += (14 * (int)Math.pow(16, i)); 
     } 
     else if (hex.charAt(j) == 'F') { 
      dec += (15 * (int)Math.pow(16, i)); 
     } 
     else if (hex.charAt(j) == '0') { 
      dec = dec; 
     } 
     else { 
      dec += ((int)hex.charAt(j)) * ((int)Math.pow(16, i)); 
     } 
     i--; 
    } 
} 
+0

Просто замечание. Вы можете избавиться от переменной 'i', заменив ее на' hex.length() - 1 - j'. Делает это также работать с шестнадцатеричными значениями, которые длиннее или короче 8 цифр ... –

+0

Если это всего лишь 8 цифр, 'Math.pow (16, i)' может быть просто '1 << i * 4', так как 16 сила 2, смещение бит. –

ответ

0

Ваша проблема в вашем предложении else, обработки цифр от 1 до 9.

Проблема заключается в том, что вы путаете цифры с символами, представляющими их. Например, цифра 1 представлена ​​символом '1', который имеет код символа 49. Таким образом, когда вы наложили символ '1' на int в своем предложении else (то есть), то вы вернетесь - это код символа 49 , а не 1.

Теперь простой (идиоматический) способ исправить это - использовать целую математику для ваших символов. Например, используйте hex.charAt(j) - '0' вместо . Это работает, потому что символам '0' через '9' назначены последовательные коды символов с 48 по 57, поэтому (например) вычитание символьного кода для '0' (что равно 48) из кода символа для '1' (что равно 49) возвращает фактическое значение цифры, с 49 - 48 = 1. То же самое относится и к другим цифрам: '5' - '0' эквивалентен 53 - 48, который (конечно) равен 5.

Еще лучше, такой же подход также работает и для ваших других шестнадцатеричных символов! Например, если вы делаете 'C' - 'A' + 10, вы получите результат 12 (который является шестнадцатеричным значением буквы C).

+0

Спасибо, что я забыл об этой проблеме! Я не практиковался в течение нескольких месяцев, и небольшие детали вроде этого определенно проскользнули у меня ... Еще раз спасибо! Я не могу выдвигаться из-за низкой репутации. – user2774695

+0

@ user2774695: Не беспокойтесь. Рад помочь. – Mac

0

Задача char для int - проблема здесь - вместо значения int, представляющего определенную цифру, вы получаете код char. Просто дайте ему пример: System.out.println((int) '5');

Самый простой способ решить это будет (hex.charAt(j) - '0').

+0

Нельзя повышать из-за низкого репутации, но спасибо вам большое сэр! – user2774695

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