将字符串表示的数字转换成为16位二进制和4位16进制表示的数字,位数不够的前面补0。16进制表示时字母用大写表示,并用字符串输出。如果数字超出范围,输出"NODATA";字符串不是数字,输出"INPUTERROR"。例如输入“15”,输出“0000000000001111,000F”
思路
1、将字符串转换为数字,判断该字符串是不是表示数字,并判断范围有没有超过16位二进制表示的范围。如果是正数,小于等于32767,如果是负数,绝对值小于等于32768。
2、如果是正数不变,如果是需将负数用补码表示
3、求出数字转成二进制后的每一位,插入到StringBuilder的开头,每求出4位后转成16进制表示。
public static String solution(String number) {
// write code here
boolean flag = true;
int n=0;
if(number.charAt(n) == '+'){
n++;
}
if(number.charAt(n) == '-'){
n++;
flag = false;
}
int res = 0;
StringBuilder builder = new StringBuilder();
StringBuilder builder1 = new StringBuilder();
Map<Integer, Character> map = new HashMap<Integer, Character>();
map.put(0,'0');
map.put(1,'1');
map.put(2,'2');
map.put(3,'3');
map.put(4,'4');
map.put(5,'5');
map.put(6,'6');
map.put(7,'7');
map.put(8,'8');
map.put(9,'9');
map.put(10,'A');
map.put(11,'B');
map.put(12,'C');
map.put(13,'D');
map.put(14,'E');
map.put(15,'F');
for(int i = n; i < number.length(); i++){
if(number.charAt(i) - '0' >= 0 && number.charAt(i) - '0' <= 9){
res = res*10+(number.charAt(i) - '0');
if(flag && res > 32767){
return "NODATA";
}
if(!flag && res > 32768){
return "NODATA";
}
}else {
return "INPUTERROR";
}
}
if(!flag){
res = res ^ 0b111111111111111;
res++;
res = res | 0b1000000000000000;
}
int tmp = 0;
int j = 4;
int dig = 1;
for(int i = 0; i < 16; i++){
tmp=tmp + (res % 2)*dig;
dig*=2;
j--;
if(j == 0){
builder1.insert(0,map.get(tmp));
j = 4;
tmp = 0;
dig = 1;
}
builder.insert(0, res % 2);
res= res/2;
}
builder.append(',');
builder.append(builder1.toString());
return builder.toString();
}