十六进制的转换练习
/**
* 十六进制的转换
* 用户输入一个数字,转换成16进制的方法.
* 1. 一句System.out.println("0x"+Integer.toHexString(26).toUpperCase());搞定
* 自己编写能编写出来么?
*/
Map表方法(并不适合):
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/** * 十六进制的转换 * 用户输入一个数字,转换成16进制的方法. * 1. 一句System.out.println("0x"+Integer.toHexString(26).toUpperCase());搞定 * 自己编写能编写出来么? * * 思路: * 1.求一个数的十六进制表现形式,就是求这个数的十六进制位的表现形式 * 这里涉及到二进制原理,二进制位中的四位为一个十六进制位 * 2.那么我们就要获取这个数的二进制的每四位 * 3.如何获取? 其实就是获取四位中的1,通过位运算可以获取 * 4.想要获取后下四位,通过对源数据进行无符号右移4位 * * 步骤: * 1.接收用户输入的这个需要转换进制的数 * 2.进行位运算&, 既然是获取四位,就是&4个1,4个1十进制就是15(任何数&15都小于15) * 3.原数据进行无符号右移4位 * */ public class HexTrans { public static void main(String[] args) { //java提供的十六进制转换方法 // System.out.println("0x"+Integer.toHexString(26).toUpperCase()); int num = 26; //假设用户输入的数字是26. (用户自定输入代码省略,无难度) //自定义十进制转十六进制工具方法 String toHex = toHexTrans(num); //输出结果 System.out.println(toHex); } /** * 自制转换十六进制工具 制作方法1:用HashMap做的 * @param num 用户输入的数字 * @return returnStr 返回转换完毕的字符串 */ public static String toHexTrans(int num) { /* 定义个字符串对象returnStr,方便增添字符*/ StringBuilder returnStr = new StringBuilder(); /*用Map表是暂时我认为不适合的方法,定义一个HashMap表,并放入key-value值.*/ Map<Integer,String> numberMap = new HashMap<Integer,String>(); numberMap.put(0, "0"); numberMap.put(1, "1"); numberMap.put(2, "2"); numberMap.put(3, "3"); numberMap.put(4, "4"); numberMap.put(5, "5"); numberMap.put(6, "6"); numberMap.put(7, "7"); numberMap.put(8, "8"); numberMap.put(9, "9"); numberMap.put(10, "A"); numberMap.put(11, "B"); numberMap.put(12, "C"); numberMap.put(13, "D"); numberMap.put(14, "E"); numberMap.put(15, "F"); /* 循环条件num不等于0就要一直取最低4位*/ while(num != 0){ /*这个值是个小于15的值,就是最低4位所对应的10进制数值*/ int temp = num & 15; /*每次&15的值temp 在表中查找对应的value值(字符串) *根据StrBuilder的insert方法,插入在0下标位置.用append方法的话,你会发现 *输出的结果是反着的.原因是append方法每次向后拼接字符串. 而我们需要的是每次 *向前插入新获得的字符串numberMap.get(temp). */ returnStr.insert(0,numberMap.get(temp)); /*原数据进行无符号右移4位*/ num = num >>> 4; } /*返回结果0x为了直观表达十六进制*/ return "0x"+returnStr.toString(); } }
集合的方法(相比Map表又省略了一列数据):
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package review.a2016.a0430; import java.util.ArrayList; import java.util.List; /** * 十六进制的转换 * 集合的方法体现 比Map好一点 */ public class HexTrans2 { public static void main(String[] args) { //java提供的十六进制转换方法 // System.out.println("0x"+Integer.toHexString(26).toUpperCase()); int num = 26; //假设用户输入的数字是26. (用户自定输入代码省略,无难度) //自定义十进制转十六进制工具方法 String toHex = HexTrans(num); //输出结果 System.out.println(toHex); } /** * 自制转换十六进制工具 制作方法1:用HashMap做的 * @param num 用户输入的数字 * @return returnStr 返回转换完毕的字符串 */ public static String HexTrans(int num) { /* 定义个字符串对象returnStr,方便增添字符*/ StringBuilder returnStr = new StringBuilder(); /*用List表是相对比Map方法好一点,定义一个ArrayList表,并放入String0~F.*/ List<String> numberList = new ArrayList<String>(); numberList.add("0"); numberList.add("1"); numberList.add("2"); numberList.add("3"); numberList.add("4"); numberList.add("5"); numberList.add("6"); numberList.add("7"); numberList.add("8"); numberList.add("9"); numberList.add("A"); numberList.add("B"); numberList.add("C"); numberList.add("D"); numberList.add("E"); numberList.add("F"); /* 循环条件num不等于0就要一直取最低4位*/ while(num != 0){ /*这个值是个小于15的值,就是最低4位所对应的10进制数值*/ int temp = num & 15; /*每次&15的值temp 在表中查找对应的value值(字符串) *根据StrBuilder的insert方法,插入在0下标位置.用append方法的话,你会发现 *输出的结果是反着的.原因是append方法每次向后拼接字符串. 而我们需要的是每次 *向前插入新获得的字符串numberMap.get(temp). */ returnStr.insert(0,numberList.get(temp)); /*原数据进行无符号右移4位*/ num = num >>> 4; } /*返回结果0x为了直观表达十六进制*/ return "0x"+returnStr.toString(); } }
数组的方法 (最简单的版本)
/**
* 十六进制的转换
* 数组的方法体现 最简单版本
* 学过,StringBuilder解决了曾经麻烦的问题,就是关于输出转换后的字符串的顺序问题.
* 结论:
对于这种数据与数据之间有对应关系,并且长度固定的,容器选择还是数组是最简单的.
* List方便增删,Map则方便找不固定顺序的对应关系数据结构.
*/
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class HexTrans3 { public static void main(String[] args) { //java提供的十六进制转换方法 // System.out.println("0x"+Integer.toHexString(26).toUpperCase()); int num = 26; //假设用户输入的数字是26. (用户自定输入代码省略,无难度) //自定义十进制转十六进制工具方法 String toHex = toHexTrans(num); //输出结果 System.out.println(toHex); } /** * 自制转换十六进制工具 制作方法1:用HashMap做的 * @param num 用户输入的数字 * @return returnStr 返回转换完毕的字符串 */ public static String toHexTrans(int num) { /* 定义个字符串对象returnStr,方便增添字符*/ StringBuilder returnStr = new StringBuilder(); /*建立一个字符类型数组,存放0~F字符*/ char[] chs = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; /* 循环条件num不等于0就要一直取最低4位*/ while(num != 0){ /*这个值是个小于15的值,就是最低4位所对应的10进制数值*/ int temp = num & 15; /*用存结果的数组接收*/ /*每次&15的值temp,即为数组chs的下标 ,把chs[temp]的字符交给StringBuilder处理就哦了*/ returnStr.insert(0,chs[temp]); /*原数据进行无符号右移4位*/ num = num >>> 4; } /*返回结果0x为了直观表达十六进制*/ return "0x"+returnStr.toString(); } }
/*
* 十六进制的转换
* 如果不用StringBuilder解决问题的版本
*/
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class HexTrans4 { public static void main(String[] args) { //java提供的十六进制转换方法 // System.out.println("0x"+Integer.toHexString(26).toUpperCase()); int num = 26; //假设用户输入的数字是26. (用户自定输入代码省略,无难度) //自定义十进制转十六进制工具方法 String toHex = HexTrans(num); //输出结果 System.out.println(toHex); } /** * 自制转换十六进制工具 制作方法1:用HashMap做的 * @param num 用户输入的数字 * @return returnStr 返回转换完毕的字符串 */ public static String HexTrans(int num) { /*建立一个字符数组,这是一个用来存最终结果的数组.长度32位*/ char[] result = new char[32]; /*建立一个字符类型数组,存放0~F字符*/ char[] chs = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; /*这里需要给下标初始化,初始化的长度字符数组本身的长度是有原因的*/ int index = chs.length; /* 循环条件num不等于0就要一直取最低4位*/ while(num != 0){ /*这个值是个小于15的值,就是最低4位所对应的10进制数值*/ int temp = num & 15; /*用存结果的数组接收*/ /* 用存结果的数组接收每个字符 并存入数组的最后1位.先--,也是有原因的*/ result[--index] = chs[temp]; /*每次&15的值temp,即为数组chs的下标 ,把chs[temp]的值赋给result[index]数组. * 而index的值要从后面的下标,往前循环,也是因为输出顺序的问题.比如不控制下标,输出结果 * 不是0x1A这样,而是0xA1,并不是我们想要的结果. * 所以上面index的初始值为数组的长度,是为了先让index以最大值,就是数组的最末尾开始存元素. */ /*原数据进行无符号右移4位*/ num = num >>> 4; } String resultStr = printResult(result,index); return "0x"+resultStr; } public static String printResult(char[] result, int index) { String str = ""; //这里的i = index 就是上面index必须先--的原因.因为这样就不会取到数组中多余的空字符,否则 //如果--在index后面,会在运算后index--,那么传入到这里的index就会变成最后有效下标的前一位. for(int i =index; i<result.length; i++){ str += result[i]; } return str; } }