2012-04-14 2 views
1

Я написал программу для преобразования шестнадцатеричного числа в эквивалентную двоичную форму с использованием следующего кода, но я получил неправильные результаты. Код выглядит следующим образом:Почему я получаю неправильный вывод

public String convert(String num){ 
    String res=""; 
    int []hex={0000,0001,0010,0011,0100,0101,0110,0111,1000,1001,1010,1011,1100,1101,1110,1111}; 
    int i; 
    char ch; 
    for(i=0;i<num.length();i++) 
    { 
     ch=num.charAt(i); 
     if(ch>='a' && ch<='f'){ 
      res+=hex[ch-97+10]+""; 
     } 
     else if(ch>='A' && ch<='F'){ 
      res+=hex[ch-65+10]+""; 
     } 
     else if(ch>='0' && ch<='9'){ 
      int d=ch-48; 
      res+=hex[d]+""; 
     } 
    } 
    return res; 
} 

Если я дать ввод образца как «12ae», то я получить соответствующий выход, как «1810101110». Это происходит только (идет не так), когда в поле ввода есть число и отлично работает только для всех символов. Но когда я меняю массив с именем hex на тип String, он дает мне точный ответ.

Это потому, что компилятор обрабатывает числа в массиве целых чисел как одну из восьми восьмеричных чисел или это связано с какой-то другой причиной?

ответ

1

Вы находитесь на правильном пути с восьмеричными номерами. Следующее объявление:

int []hex={0000,0001,0010,0011,0100,0101,0110,0111,1000,...}; 

объявляет массив целых чисел, в словах, было бы

zero 
one 
eight 
nine 
sixty-four 
sixty-five 
seventy-two 
seventy-three 
one thousand 

и так далее. Это явно не то, что вы хотите. Если вы объявите hex как String[] hex и используете "0000","0001",..., тогда вы получите предполагаемый ответ.

+0

Спасибо, что помогли мне Грег –

3

Ваши номера, подобные 0010, интерпретируются как восьмеричные числа. Письмо 0010 такое же, как написание 8.

Вы можете преобразовать в двоичную строку, используя Integer.binaryString.

+0

+1, если вы покажете, как отображать шестнадцатеричные цифры :) –

+0

спасибо за помощь Марка –

+0

я использовал это тоже, но я хотел бы представить каждую шестнадцатеричную цифру в качестве 4 цифры в двоичной форме, поэтому мне пришлось опустить метод (поскольку он не давал преобразований до 4 цифр). –

0

Если вы пишете это:

int []hex={0000,0001,0010,0011,0100,0101,0110,0111,1000,1001,1010,1011,1100,1101,1110,1111}; 

затем Java конечно автоматически не знают, что они должны быть истолкованы как двоичные числа.

Целочисленные литеры, начинающиеся с 0, интерпретируются как восьмеричные числа. Целочисленные литеры, начинающиеся с 1, до 9, интерпретируются как десятичные цифры.

Если вы используете Java 7, вы можете использовать новый 0b синтаксис для двоичных чисел:

int[] hex ={ 0b0000, 0b0001, 0b0010, 0b0011, ..., 0b1111 }; 

В противном случае, используйте десятичное или шестнадцатеричное:

int[] hex = { 0, 1, 2, 3, 4, ..., 15 }; 
int[] hex = { 0x0, 0x1, 0x2, 0x3, ..., 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF }; 

Но поскольку это только цифры от 0 до 15, вам даже не нужен массив: потому что hex[i] == i, вы можете просто использовать i напрямую, а не hex[i].

0

Номера под восьмью считаются восьмеричными, между прочим, если они не обрабатываются как окталии 0001, будут изменены на 1 и 0101, будет изменено на 101, поэтому вы потеряете нулевые нули в двоичном формате.

Кстати, вы можете сделать это:

int value = Integer.parseInt(hex, 16); 
String binary = Integer.toBinaryString(value); 
Смежные вопросы