问题原文点击打开链接
这道题难度为easy,但是十分的繁琐。由于没有用到库函数,所以代码非常冗长。做好这道题的前提要了解原码、补码的概念,还有清楚解决INT型负整数的临界值。代码如下
//反转字符串
public String reverse(String code){
char[] tmp = code.toCharArray();
for (int i = 0;i<tmp.length/2;i++){
char x = tmp[i];
tmp[i] = tmp[tmp.length-1-i];
tmp[tmp.length-1-i] = x;
}
StringBuilder res = new StringBuilder();
for (int i = 0;i<tmp.length;i++)
res.append(tmp[i]);
return res.toString();
}
//根据反码求出补码
public String compCode(String code){
char[] hex = new char[]{'0','1','2','3','4','5','6','7','8','9','a','b',
'c','d','e','f'};
char[] tmp = code.toCharArray();
tmp[tmp.length-1]+=1;
for (int i = tmp.length-1;i>0;i--){
if (tmp[i]<=58){
if (tmp[i]-48>15){
tmp[i-1] += 1;
tmp[i] = hex[tmp[i]-48-16];
}else{
tmp[i] = hex[tmp[i]-48];
}
}else{
if (tmp[i]-87>15){
tmp[i-1] += 1;
tmp[i] = hex[tmp[i]-87-16];
}else{
tmp[i] = hex[tmp[i]-87];
}
}
}
StringBuilder res = new StringBuilder();
for (int i = 0;i<tmp.length;i++)
res.append(tmp[i]);
return res.toString();
}
//求出原码的反码
public String onesComplCode(String code){
char[] hex = new char[]{'0','1','2','3','4','5','6','7','8','9','a','b',
'c','d','e','f'};
StringBuilder res = new StringBuilder();
//'a'在ascci码表里面是对应97,'0'对应48
for (int i = 0;i< code.length();i++){
if (code.charAt(i)<58) {
/*
* 拿字符'0'举例,'0'-48 is 0 ,对应hex表位置0,而它对应的相反字符为'f'
* 'f'在hex表当中对应位置为16
* */
res.append(hex[15 - (code.charAt(i) - 48)]);
}else{
res.append(hex[15 - (code.charAt(i) - 87)]);
}
}
return res.toString();
}
//求出正整数的原码
public String trueCode(int num){
char[] hex = new char[]{'0','1','2','3','4','5','6','7','8','9','a','b',
'c','d','e','f'};
StringBuilder res = new StringBuilder();
while(num>15){
res.append(hex[num%16]);
num/=16;
}
res.append(hex[num]);
for (int i = res.length()+1;i <= 8;i++)
res.append(0);
return reverse(res.toString());
}
public String toHex(int num) {
if (num == 0) return "0";
if (num == -2147483648) return "80000000";
String code = "";
if (num>0){
code = trueCode(num);
}else{
code = trueCode(Math.abs(num));
System.out.println("原码"+code );
code = onesComplCode(code);
System.out.println("反码"+code);
code = compCode(code);
System.out.println("补码"+code);
}
int i = 0;
while(i<code.length()){
if (code.charAt(i) != '0'){
code = code.substring(i,code.length());
break;
}else{
i++;
}
}
return code;
}