我写了一个程序,使用以下代码将十六进制数转换为其等效的二进制形式,但我得到了错误的结果。代码如下:
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类型的数组时,它给出了确切的答案。
是因为编译器将整数数组中的数字视为某种形式的八进制数,还是因为某些其他原因?
答案 0 :(得分:3)
您的0010
之类的数字被解释为八进制数字。写0010
与撰写8
相同。
您可以使用Integer.binaryString
转换为二进制字符串。
答案 1 :(得分: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",...
,那么您将获得预期的答案。
答案 2 :(得分:0)
如果你这样写:
int []hex={0000,0001,0010,0011,0100,0101,0110,0111,1000,1001,1010,1011,1100,1101,1110,1111};
然后Java ofcourse不会自动知道这些应该被解释为二进制数。
以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]
答案 3 :(得分:0)
低于8的数字被视为八进制,顺便说一下,如果它们不被视为八进制,则0001将被更改为1,0101将被更改为101,因此您将以二进制格式丢失所需的零。
顺便说一句,你可以这样做:
int value = Integer.parseInt(hex, 16);
String binary = Integer.toBinaryString(value);