黑马程序员技术交流社区

标题: 昨天写了个进制转换的demo,分享下 [打印本页]

作者: 宇轩H    时间: 2017-2-19 11:01
标题: 昨天写了个进制转换的demo,分享下
package com.eshel.test;
/**
* 进制转换
* @author 郭世文
* @version 1.0
*/
public class HexTransform {
        public final int TWO_TYPE = 2;//二进制
        public final int EIGHT_TYPE = 8;//八进制
        public final int SIXTEEN_TYPE = 16;//十六进制
        private final static String TEN = "A";//十六进制中10
        private final static String TEN_ADD_ONE = "B";//十六进制中11
        private final static String TEN_ADD_TWO = "C";//十六进制中12
        private final static String TEN_ADD_THREE = "D";//十六进制中13
        private final static String TEN_ADD_FOUR = "E";//十六进制中14
        private final static String TEN_ADD_FIVE = "F";//十六进制中15
       
        /**
         * <p><blockquote><pre>
           整数转换为二进制、八进制、十六进制
                 46        除数        余数        商                               
                        2        0        23
                        2        1        11
                        2        1        5
                        2        1        2
                        2        0        0
                                1

                        计算机 转换: 46--> 101110

                55        2        1        27
                        2        1        13
                        2        1        6
                        2        0        3
                        2        1        1
                        2        1        0

         首先定义String num2 用来接收转换后的二进制
         然后定义局部变量 除数t 余数y  商 s
         把num的值赋值给商s
         使用while(true)循环进行除法并把余数添加到num2末尾
         判断商是否为0 如果商为0,再判断余数是否为0,如果余数也为0,则在num2末尾添加一个1,最后break跳出循环
         把num2的内容反转然后返回
</blockquote></pre></p>

         * @param num 十进制数
         * @param type 值为 {@link TWO_TYPE}或{@link EIGHT_TYPE}或{@link SIXTEEN_TYPE }
         * @return 返回 result
         */
        public static String intTo(int num,int type) {
                String result = "";
                int t = type;//除数
                int y = 0;//余数
                int s = num;//商
               
                while(true){
                        y = s%t;
                        s /= t;
                        if(t == 16 && y >=10 ){
                                String y2 = "";
                                switch(y){
                                case 10 :
                                        y2 = TEN;
                                        break;
                                case 11 :
                                        y2 = TEN_ADD_ONE;
                                        break;
                                case 12 :
                                        y2 = TEN_ADD_TWO;
                                        break;
                                case 13 :
                                        y2 = TEN_ADD_THREE;
                                        break;
                                case 14 :
                                        y2 = TEN_ADD_FOUR;
                                        break;
                                case 15 :
                                        y2 = TEN_ADD_FIVE;
                                        break;
                                }
                                result+=y2;
                        }else
                                result+=y;
                        if(s == 0){
                                result += y == 0 ? "1" : "";
                                break;
                        }
                }
                result = new StringBuffer(result).reverse().toString();
                return result;
        }
        /**
         * <p><blockquote><pre>
           二进制、八进制、十六进制转换为整数
           46        除数                余数                商                       
                    2                0                23
                    2                1                11
                    2                1                5
                    2                1                2
                    2                0                0
                                    1
          101110      因子                元素                结果
                             2                0*2^0        0               
                             2                1*2                2
                             2                1*2*2        4
                             2                1*2*2*2        8
                             2                0*2*2*2*2  0
                             2                1*2*2*2*2*2         32
         *                         0+2+4+8+0+32=46
                        计算机 转换: 46--> 101110
                       
         *首先定义int result 用来接收转换后的十进制
         *然后把num反转并赋值给num
         *定义numChar 并把num转换为字符数组赋值给 numChar
         *然后定义局部变量 因子t 元素 y  结果 r
         *使用for(int i = 0;i<numChar.lenght();i++)循环
         *
         *把numChar[i]转换为整数y = 0 或1
         *进行乘法运算 r = y*2^i;
         *result+=r;
         *
         *把result的内容返回
         * </blockquote></pre></p>
         * 将二进制、八进制、十六进制转换为十进制
         * @param num                数值
         * @param type                数值进制类型
         * @retrurn
         */
        public static int ToInt(String num , int type ) {
                int result = 0;
                num = new StringBuffer(num).reverse().toString();
                char[] numChar = num.toCharArray();
                int t;
                int y;
                int r;
                for(int i = 0;i<numChar.length;i++){
                        try {
                                r = Double.valueOf(Math.pow(type, i)).intValue()*numCharToInt(numChar[i]);
                                result += r;
                        } catch (Exception e) {
                                System.out.println("输入进制有误");
                                e.printStackTrace();
                        }
                       
                }
                return result;

        }
        /** 二进制转换为十进制、八进制、十六进制
         *
         * @param num 要转换的数
         * @param type 要转换为什么类型
         * @return
         */
        public static Object binaryTo(String num , int type ) {
                if(type != 2){
                Object result = null;
                result = ToInt(num, 2);
                switch(type){
                        case 8:
                                result = intTo((Integer)result , 8);
                                break;
                        case 16:
                                result = intTo((Integer)result , 16);
                                break;
                }
                return result;
                }
                return num;
               
        }
        /** 十进制、八进制、十六进制转换为二进制
         *
         * @param num 要转换的数
         * @param type 要转换的类型
         * @return
         */
        public static String toBinary(Object num , int type ){
                if(type != 2){
                        Object result = num;
                        if(type !=10 ){
                                result = ToInt(num.toString(), type);
                        }
                        return intTo((Integer)result, 2);
                }
                return num.toString();
               
        }
        /** 八进制转换为十六进制
         *
         * @param num 要转换的数
         * @return
         */
         
        public static String EightToSixteen(String num ) {
                Object result = null;
                result = ToInt(num, 8);
                result = intTo((Integer)result, 16);       
                return result.toString();
               
        }
        /** 十六进制转换为八进制
         * @param num 要转换的数
         * @return
         */
        public static String SixteenToEight (String num){
                Object result = null;
                result = ToInt(num, 16);
                result = intTo((Integer)result, 8);       
                return result.toString();
               
        }
       
        private static int numCharToInt(char charNum) throws Exception {
                int num = -1;
                char[]charArray = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E'};
                for(int i=0;i<charArray.length;i++){
                        if(charArray[i] == charNum)
                                num = i;
                }
                if(num == -1){
                        throw new Exception("charArray[]数组中没有字符charNum");
                }else
                        return num;
               
        }
}


作者: 首尔街少年    时间: 2017-2-19 11:26
厉害了我的哥

作者: lvshen9    时间: 2017-2-19 11:49
赞一个


作者: guobx    时间: 2017-2-19 11:49
加油加油加油加油

作者: 烟雨清寒时    时间: 2017-2-19 12:27
可以的,楼主将来必定成为一代大牛

作者: liangliangge    时间: 2017-3-6 08:56
努力学习中
作者: 破釜沉舟7    时间: 2017-3-6 11:11
膜拜大神





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2