天天看点

十六进制转十进制 蓝桥杯

问题描述

  从键盘输入一个不超过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;
	}
}