用方法实现十六进制和十进制之间的转换

十六进制和十进制互换:

十进制转化成十六进制基本逻辑:十进制数 / 16,然后反取余数
取的余数又分两种情况:余数0-9和10-15

第一种:比如98 / 16   商 6 余 2
String hex = "";  余数拼接的时候,把求的余数往前拼接
hex = temp + hex ==>   hex = 2 + "";   ==>  hex = 6 + 2; ==> 62

第二种:先把余数转化成字符,然后在拼接
先减一个10,在加字符'A',因为这个是10往后的,也不知道是A后面的第几个
所以就先减一个10,就只取个位数了,最后在强制转化成char型,在往前拼接
hex = (char)(temp - 10 + 'A') + hex;

十六进制转化成十进制基本逻辑:每一位数字都要乘它的权减n-1次方, n为当前位数
6E -> 6 * 16 + 14 * 1

需要先遍历字符串,把输入的十六进制当成字符串数组处理
for(int i = 0;i < hex.length();i++){
Char tempChar = hex.charAt(i);
}
从左往右遍历

比如hex = 6E,访问的时候先访问6,i = 0,相当于是倒过来就是数组长度- 1 - i
这是一个规律,即如果数组中首元素下标为i,那么最后一个元素的下标为len- 1 - i 

同样两种情况:'0'-'9' 'A'-'F'
if(tempChar >= '0' && tempChar <= '9'){
decNum +=(tempChar - '0') *  Math.pow(16, hex.length()- 1 - i);

//某一个字符,我也不知道这个是几,反正是从0开始的,求和0之间的差值就知道是算术的几了,变整型
如果不减,它就是字符类型

}else if(tempChar >= 'A' && tempChar <='F'){
decNum +=(tempChar - 'A' + 10) *  Math.pow(16, hex.length()- 1 - i);
}//同理就是先求和A之间的差值就知道是算术的几了,在把10加回来,变成整型的数字
import java.util.Scanner;

/**
 * 十六进制和十进制之间的转换
 * 暂时不管小数,使用方法
 * @author Monster丶ZF
 * @version1.8
 * @data 2019年4月20日
 * @remakeTODO
 */
public class HexToDecimlDemo {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		//1.让用户输入一个十进制数字
		System.out.print("请输入一个整型数字:");
		int decNum = input.nextInt();
		//2.调用方法,将十进制转化成十六进制
		System.out.println("十进制转换为十六进制:" + decToHex(decNum));
		//3.将16进制转换回十进制
		System.out.println( "十六进制转换为十进制:"+ hexToDec(decToHex(decNum)));//调用两次,方法调方法
         input.close();
	}
	/**
	 * 调用方法将16进制转换为10进制
	 * @param hex   要转化的16进制数字
	 * @return 转化成10进制的数字
	 */
	public static int hexToDec(String hex){
		//int decNum = Integer.MIN_VALUE;   //因为最后是需要累加值,所以初值为0;
		int decNum = 0;
		// 6E-> 6 * 16+14 * 1  //每一位数字都要乘它的权减n-1次方, n为当前位数
		//需要遍历16进制字符串
		for (int i = 0; i < hex.length(); i++) {  //把输入的16进制数当做一个字符串数组
			//取出字符串中的每一个字符进行判断和转化  从左往右遍历
			char tempChar = hex.charAt(i);   //取出字符串中第i个字符
			//两种情况:'0'-'9'  'A'-'F'
			if(tempChar >= '0' && tempChar <= '9'){
				decNum +=(tempChar - '0') *  Math.pow(16, hex.length()- 1 - i);
				//某一个字符,我也不知道这个是几,反正是从0开始的,求和0之间的差值就知道是算术的几了,变整型
			}else if(tempChar >= 'A' && tempChar <='F'){
				decNum +=(tempChar - 'A' + 10) *  Math.pow(16, hex.length()- 1 - i);
			}//同理就是先求和A之间的差值就知道是算术的几了,在把10加回来,变成整型的数字
			
		}
		return decNum;
	}
     /**
      * 调用方法将10进制转化成16进制
      * @param decNum   要转化的10进制数字
      * @return 转换成16进制的数字(以字符串的形式返回)
      */
	public static String decToHex(int decNum ){
		// 98/16反取余数
		// 98 / 16 商6余12
		String hex = ""; //转化好的16进制字符串
		while(decNum != 0){
			int temp = decNum % 16; //先取余数
			//余数有可能是0-9之间的数字或10-15之间的数字
			if(temp >=0 && temp <= 9){
				hex = temp + hex;   //每取一个余数,就在前拼接
			}else if(temp >= 10 && temp <=15){
				//把数字转化成字符在拼接
				hex =(char)(temp - 10 + 'A' )+ hex;   //%10也可以
			}
			//求商
			decNum /= 16; 
		}
		return hex;
	}
	

	
	
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/w15977858408/article/details/89413252