这是我编写的代码:
public String binary(String s)
{
String[] a = {
"0000","0001","0010","0011","0100","0101","0110","0111",
"1000","1001","1010","1011","1100","1101","1110","1111"
};
String k = "";
for(int i = 0; i <= s.length() - 1; i++)
{
if (s.charAt(i) == 'a') { k += a[10]; }
else if (s.charAt(i) == 'b') { k += a[11]; }
else if (s.charAt(i) == 'c') { k += a[12]; }
else if (s.charAt(i) == 'd') { k += a[13]; }
else if (s.charAt(i) == 'e') { k += a[14]; }
else if (s.charAt(i) == 'f') { k += a[15]; }
else { k += a[i]; }
}
return k;
}
我输出为[0-9] = 0000.我该如何解决这个问题?我做错了什么?
答案 0 :(得分:1)
问题在于使用a[i]
。这是逻辑错误。 因为 i
是循环变量,表示s
String
中的当前索引。但是您正在使用它在变量a
中对其进行索引。因此,i
变量在这里使用不正确。
以下内容经过更正(并经过优化)代码。看到它正常工作here:
public class HexaDecimal
{
public String binary(String s)
{
String[] a= {"0000","0001","0010","0011","0100","0101","0110","0111","1000","1001","1010","1011","1100","1101","1110","1111"};
String k="";
for(int i=0;i<s.length();i++)
{
char ch = Character.toUpperCase(s.charAt(i));
if(ch>='A' && ch <= 'F') k+= a[ch - 'A' + 10];
else k+= a[ch - '0'];
}
return k;
}
}
答案 1 :(得分:0)
将k+=a[i];
替换为k+=a[s.charAt(i) - '0'];
您正在使用字符串索引循环变量作为a
的索引,而不是字符串中该位置的字符。
你需要做- '0'
从unicode代码点转换为它代表的ASCII数字值(我假设你想在这里使用)
答案 2 :(得分:0)
你的最后一个做错了计算。它没有考虑输入什么,只考虑位置。你希望它是
else {
k += a[s.charAt(i) - '0'];
}
有更简单的方法来获取十六进制的二进制表示,并且您可能还想检查输入中它不包含除0-9或a-f以外的任何内容。
答案 3 :(得分:0)
您可以将for循环更改为:
for(int i=0; i < s.length(); i++)
{
char c = s.charAt(i);
if (c >= '0' && c <= '9') k += a[c - '0'];
else if (c >= 'a' && c <= 'f') k += a[c - 'a' + 10];
else if (c >= 'A' && c <= 'F') k += a[c - 'A' + 10];
else throw new InvalidArgumentException(s);
}
至少在我看来,这是更简单和不言自明的。处理数字,大写和小写字母,并在输入错误时以预期的方式失败。