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 类型时,它给了我确切的答案。

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

4

4 回答 4

3

你喜欢的数字0010被解释为八进制数。写作0010和写作一样8

您可以使用Integer.binaryString.

于 2012-04-14T05:56:55.200 回答
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",...,那么您将得到预期的答案。

于 2012-04-14T05:58:15.793 回答
0

如果你这样写:

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

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

以 a 开头的整数文字0被解释为八进制数。1以to开头的整数文字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].

于 2012-04-14T06:10:44.267 回答
0

低于 8 的数字被视为八进制,顺便说一下,如果它们不被视为八进制,0001 将更改为 1,0101 将更改为 101,因此您将丢失二进制格式所需的零。

顺便说一句,你可以这样做:

int value = Integer.parseInt(hex, 16);
String binary = Integer.toBinaryString(value);
于 2012-04-14T06:13:16.127 回答