十六进制的转换练习

/**
 *    十六进制的转换 
 *    用户输入一个数字,转换成16进制的方法.
 *    1. 一句System.out.println("0x"+Integer.toHexString(26).toUpperCase());搞定
 *    自己编写能编写出来么?
 */
Map表方法(并不适合):
/**
 *    十六进制的转换 
 *    用户输入一个数字,转换成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();
    }
}
View Code

集合的方法(相比Map表又省略了一列数据):

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();
    }
}
View Code

数组的方法 (最简单的版本)

/**
* 十六进制的转换
* 数组的方法体现 最简单版本
* 学过,StringBuilder解决了曾经麻烦的问题,就是关于输出转换后的字符串的顺序问题.
* 结论:

 对于这种数据与数据之间有对应关系,并且长度固定的,容器选择还是数组是最简单的.
* List方便增删,Map则方便找不固定顺序的对应关系数据结构.
*/

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();
    }
}
View Code
/*
 *    十六进制的转换 
 *    如果不用StringBuilder解决问题的版本
 */
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;
    }
}
View Code

 

  
 
posted @ 2016-04-30 21:28  安仔80  阅读(259)  评论(0编辑  收藏  举报