问题描述
从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。
样例输入
FFFF
样例输出
65535
写这道题是一个比较悲惨的故事,写了1小时,debug2小时,关键永远不认为自己错了;
错误原因主要是变量名太相似了;
其次我突然弄混了一般的和Java中的“^”,我就不明白为什么运算结果就是不对,我一开始很盲目,后来静下心来,仔细看可能出错的地方,把可能出错的地方打印出来;
package 蓝桥杯题库;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/*
*将输入的字符串变为字符数组;将字符数组变为二进制数组;二进制转10进制
*/
public class oj{
public static void main(String[] args) throws IOException{
BufferedReader re=new BufferedReader(new InputStreamReader(System.in));
String s1="",s2="";//s1 存放16进制字符串,s2存放二进制字符串;
long sum;//存放结果
s1=re.readLine().toUpperCase();//读入字符串,如果是小写,自动转化为大写
s2=hexToBinary(s1);//16进制字符串转化为2进制字符串
sum=binaryToDecimal(s2);//2进制返回为10进制
System.out.println(sum);//打印结果
}
//16进制转化为2进制
public static String hexToBinary(String s){
char[] ch={'0','1'};
String str=new String("0123456789ABCDEF");//每一个字符所在位置索引就是该数大小,比如a在第10的位置,则实际代表10进制10;
char[] ch1=s.toCharArray();//16进制的字符串转化为16进制的字符数组
int pos=ch1.length*4;//涉及到进制转化问题,可以看我另一篇文章,,简单说,1位16进制可以被4位2进制代替
char[] ch2=new char[pos];//ch2用来保存转化的2进制数组
for(int i=ch1.length-1;i>=0;i--){
int temp=str.indexOf(ch1[i]);//indexOf函数作用即返回某一字符在str的位置,即所代表的10进制数大小,indexOf从0开始
for(int j=0;j<4;j++){
ch2[--pos]=ch[temp&1];//&按位与,比如a是1010,则temp&1=0,即ch[--pos]位置是ch[0]=='0'
temp=temp>>>1;//位移操作符,比如1010,位移后为101,那么temp&1=1;
}
}
return new String(ch2);//返回2进制字符串
}
//二进制转10进制
public static long binaryToDecimal(String s){
long sum=0;//保存结果
for(int i=0;i<s.length();i++){
sum+=(s.charAt(s.length()-i-1)-'0')*(Math.pow(2,i));//‘0’和0 是有数值区别的,‘0’==int 48;
}
return sum;
}
}