二進制、十六進制和十進制的轉換算法


一、二進制和十進制的轉換

/**
 * 十進制和二進制間的轉換
 */
public class IntToBinary {
    public static void main(String[] args) {
        int a = -23422;
        String str;
        System.out.println("======================使用自己寫的方法=============================");
        str = intToBinaryString(a);
        System.out.println(str);
        System.out.println(binaryStringToInt(str));
        System.out.println("======================使用Integer中的方法=============================");
        str = Integer.toBinaryString(a);
        System.out.println(str);
//        System.out.println(Integer.parseInt(binaryString, 2));    //只能轉換正數,轉換負數報錯
        System.out.println(Integer.parseUnsignedInt(str, 2));

    }

    /**
     * int轉二進制字符串
     *
     * 算法一:除2取余
     *  正數:除2取余-->倒序
     *  負數(補碼):先加1-->轉換成正數-->除2取余,並取反-->高位補1-->倒序
     * @param num 整數
     */
    public static String intToBinaryString(int num){
        StringBuilder stringBuilder = new StringBuilder();
        boolean flag = false;   //標志:true表示為負數
        int rem;
        if (num == 0){
            return "0";
        }else if(num < 0){
            flag = true;
            num = Math.abs (num + 1);
        }

        while (num != 0){
            //正數,保持不變;負數,取反
            rem = (!flag && num % 2 == 0) || (flag && num % 2 == 1) ? 0 : 1;
            num = num / 2;
            stringBuilder.append(rem);
        }

        //判斷是否為負數,如果是負數,那么前面所有位補1
        if(flag){
            num = stringBuilder.length();
            for(int i = 1; i <= 32 - num; i++){
                stringBuilder.append("1");
            }
        }

        return stringBuilder.reverse().toString();

    }

    /**
     * int轉二進制字符串
     *
     * 算法二:原數據的每一位和1進行與運算,判斷1和0
     * @param num 整數
     */
    public static String intToBinaryString2(int num){
        StringBuilder stringBuilder = new StringBuilder();
        boolean flag = false;   //標志:true表示為負數

        for(int j=31;j>=0;j--) {

            if (((1 << j) & num) != 0){
                flag = true;
                stringBuilder.append("1");
            } else{
                if (flag){
                    stringBuilder.append("0");
                }
            }
        }

       return stringBuilder.toString();

    }

    /**
     * 二進制字符串轉int
     *
     * 算法一:每位數字* 2的n-1次方,並相加
     * @param binaryStr 二進制字符串
     */
    public static int binaryStringToInt(String binaryStr){
        int result =0, rem;
//        //正序遍歷
//        for (int i = 0; i < binaryStr.length(); i++){
//            char c = binaryStr.charAt(i);
//            rem = c - '0';
//
//            //使用Math.pow()方法,計算2的n-1次方
////            result += rem * (int) Math.pow(2, (binaryStr.length() - 1 - i));
//
//            //使用位移,計算2的n-1次方
//            result += rem << (binaryStr.length() - 1 - i);
//        }

        //倒序遍歷
        int _pow = 1;
        for (int i = binaryStr.length() - 1; i >= 0 ; i--){
            char c = binaryStr.charAt(i);
            rem = c - '0';

            result += rem * _pow;
//            _pow = (int) Math.pow(2, (binaryStr.length() - i));  //使用Math.pow()方法,計算2的n-1次方
            _pow = _pow << 1;   //使用位移,計算2的n-1次方
        }
       return result;
    }

    /**
     * 二進制字符串轉int
     *
     * 算法二:使用二進制轉十進制的逆運算:被除數 = 除數 * 商 + 余數
     * @param binaryStr 二進制字符串
     */
    public static int binaryStringToInt2(String binaryStr){
        int result =0, rem, temp;
        for (int i = 0; i < binaryStr.length(); i++){
            char c = binaryStr.charAt(i);
            rem = c - '0';  //計算出二進制值0或1
            //使用二進制轉十進制的逆運算:被除數 = 除數 * 商 + 余數
            result = result * 2 + rem;
        }
       return result;
    }
}

二、十六進制和十進制的轉換

package com.wslook.algorithm.radix;

public class IntToHexString {
    public static void main(String[] args) {
        int a = 23422;
        String str;
        System.out.println("======================使用自己寫的方法=============================");
        str = intToHexString(a);
        System.out.println(str);
//        str = "ffffa482";
        System.out.println(hexStringToInt2(str));
        System.out.println("======================使用Integer中的方法=============================");
        str = Integer.toHexString(a);
        System.out.println(str);
//        System.out.println(Integer.parseInt(binaryString, 16));    //只能轉換正數,轉換負數報錯
        System.out.println(Integer.parseUnsignedInt(str, 16));

    }

    /**
     * int轉十六進制字符串
     *
     * 算法一:先求出二進制字符串,再轉換成十六進制字符串
     * @param num 整數
     */
    public static String intToHexString(int num){
        String binaryStr = IntToBinary.intToBinaryString(num);

        //二進制串轉十六進制串
        int count = binaryStr.length();
        StringBuilder sb = new StringBuilder();
        String subStr;
        while (count > 0){

            if (count <= 4){
                subStr = binaryStr.substring(0, count);
            }else {
                subStr = binaryStr.substring(count - 4, count);
            }

            count -= 4;
            int c = IntToBinary.binaryStringToInt2(subStr);
            sb.append(trans(c));

        }

        return sb.reverse().toString();

    }

    /**
     * 整數轉十六進制字符串
     * @param deci 小於16的正整數
     * @return
     */
    private static char trans(int deci){
        if (deci < 10){
            return (char) (deci + 48);
        }

//        return (char) (deci + 55);  //轉成大寫A-F
        return (char) (deci + 87);  //轉成小寫a-f
    }

    /**
     * 十六進制字符串轉int
     *
     * 算法一:每位數字* 2的n-1次方,並相加
     * @param str 十六進制字符串
     */
    public static int hexStringToInt(String str){
        int result = 0, rem = 0, _pow = 1;
        //正序遍歷字符串
        for (int i = 0; i < str.length(); i++){
            char hex = str.charAt(i);
            if (hex >= '0' && hex <= '9'){
                rem = hex - 48;     //轉換成數字0-9
            }else if (hex >= 'a' && hex <= 'f'){
                rem = hex - 87;     //轉換成數字10-15,'a'= 97
            }else if (hex >= 'A' && hex <= 'F'){
                rem = hex - 55;     //轉換成數字10-15,'A'= 65
            }

            //使用位移,計算16的n-1次方-----【16的n次方 =  1 << 4n】
            _pow = (int) Math.pow(16, (str.length() - 1 - i));
//            _pow = 1 << (4 * (str.length() -1 - i));
            result += rem * _pow;
        }

//        //倒序遍歷字符串
//        for (int i = str.length() - 1; i >= 0; i--){
//            char hex = str.charAt(i);
//            if (hex >= '0' && hex <= '9'){
//                rem = hex - 48;
//            }else if (hex >= 'a' && hex <= 'f'){
//                rem = hex - 87;
//            }else if (hex >= 'A' && hex <= 'F'){
//                rem = hex - 55;
//            }
//
//            //使用位移,計算16的n-1次方-----【16的n次方 = 2 << (4n -1)】
//            result += rem * _pow;
////            _pow = (int) Math.pow(16, (str.length() - i));
//            _pow = _pow << 4;
//        }
       return result;
    }

    /**
     * 十六進制字符串轉int
     *
     * 算法二:使用十六進制轉十進制的逆運算:被除數 = 除數 * 商 + 余數
     * @param str 十六進制字符串
     */
    public static int hexStringToInt2(String str){
        int result =0, rem = 0, temp;
        for (int i = 0; i < str.length(); i++){
            char hex = str.charAt(i);
            if (hex >= '0' && hex <= '9'){
                rem = hex - 48;     //轉換成數字0-9
            }else if (hex >= 'a' && hex <= 'f'){
                rem = hex - 87;     //轉換成數字10-15,'a'= 97
            }else if (hex >= 'A' && hex <= 'F'){
                rem = hex - 55;     //轉換成數字10-15,'A'= 65
            }
            //使用十六進制轉十進制的逆運算:被除數 = 除數 * 商 + 余數
            result = result * 16 + rem;
        }
       return result;
    }
}

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com