2012-04-14 50 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的数组更改为字符串类型时,它给了我确切的答案。

是因为编译器将整数数组中的数字视为八进制数的某种形式还是因为其他原因?

回答

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 

等。这显然不是你想要的。如果您声明hexString[] hex,并使用"0000","0001",...,那么您将得到预期的答案。

+0

谢谢你帮我出格雷格 – 2012-04-14 06:02:44

3

您的号码如0010被解释为八进制数字。写作0010与写作8相同。

您可以使用Integer.binaryString转换为二进制字符串。

+0

+1如果你展示如何显示十六进制数:) – 2012-04-14 05:58:25

+0

感谢您的帮助马克 – 2012-04-14 06:02:18

+0

我用太多,但我想代表每个十六进制数字作为4位数的二进制形式,所以我不得不忽略该方法(因为它没有给出转换最多4位数字)。 – 2012-04-14 06:11:35

0

如果你这样写:

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

那么Java ofcourse不会自动知道,这些应该被解释为二进制数。

0开头的整数文字被解释为八进制数字。以19开头的整数文字被解释为十进制数字。

如果您使用的是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);