用方法实现十六进制和十进制之间的转换
程序员文章站
2024-03-17 12:17:52
...
十六进制和十进制互换:
十进制转化成十六进制基本逻辑:十进制数 / 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;
}
}