进制转换 Number Base Conversion

Binary Conversion

package io.programming.bodh;


/**
 * @Author Labu
 * @Description 二进制转换
 */
public class BinaryConversion {


    /**
     * 二进制字符串转成八进制字符串
     *
     * @param inputBin 二进制字符串
     * @return java.lang.String
     * @author Labu
     */
    public static String binaryToOctal(String inputBin) {
        if (!Bodh.isLegalBin(inputBin))
            return "无效的二进制字符串";
        String[] baseArray = getBaseArray(inputBin, Bodh.OCTAL);
        String result = "";
        for (String s : baseArray) {
            result += binaryToDecimal(s);
        }
        return result;
    }


    /**
     * 二进制字符串转成十进制字符串
     *
     * @param inputBin 二进制字符串
     * @return java.lang.String
     * @author Labu
     */
    public static String binaryToDecimal(String inputBin) {
        if (!Bodh.isLegalBin(inputBin))
            return "无效的二进制字符串";
        return Bodh.convertToDecimal(inputBin, Bodh.BINARY);
    }


    /**
     * 二进制字符串转成十六进制字符串
     *
     * @param inputBin 二进制字符串
     * @return java.lang.String
     * @author Labu
     */
    public static String binaryToHexadecimal(String inputBin) {
        if (!Bodh.isLegalBin(inputBin))
            return "无效的二进制字符串";
        String[] baseArray = getBaseArray(inputBin, Bodh.HEXADECIMAL);
        String result = "";
        for (String s : baseArray) {
            result += Bodh.toHexChar(Integer.parseInt(binaryToDecimal(s)));
        }
        return result;
    }


    /**
     * 将二进制字符串分割成3个一组(八进制)的字符串数组或者4个一组(十六进制)的字符串数组
     *
     * @param input      输入字符串
     * @param targetBase 目标进制基数
     * @return 字符串数组
     */
    private static String[] getBaseArray(String input, byte targetBase) {
        byte divideBase = targetBase == Bodh.OCTAL ? Bodh.OCTAL_DIVIDE_BASE : Bodh.HEXADECIMAL_DIVIDE_BASE;
        int length = input.length();
        int count = length / divideBase + (length % divideBase == 0 ? 0 : 1);
        String[] result = new String[count];
        for (int i = 0; i < count && length >= 0; i++, length -= divideBase) {
            int index = length - divideBase;
            if (length < divideBase) {
                index = 0;
            }
            String substring = input.substring(index, length);
            result[count - i - 1] = substring;
        }
        return result;
    }

}

Octal Conversion

package io.programming.bodh;


/**
 * @Author Labu
 * @Description 八进制转换
 */
public class OctalConversion {

    /**
     * 八进制转二进制
     *
     * @param inputOct 输入的八进制数
     * @return java.lang.String
     * @author Labu
     */
    public static String octalToBinary(String inputOct) {
        if (!Bodh.isLegalOct(inputOct))
            return "无效的八进制字符串";
        return Bodh.convertToBinary(inputOct, Bodh.OCTAL_DIVIDE_BASE);
    }

    /**
     * 八进制转十进制
     *
     * @param inputOct 输入的八进制数
     * @return java.lang.String
     * @author Labu
     */
    public static String octalToDecimal(String inputOct) {
        if (!Bodh.isLegalOct(inputOct))
            return "无效的八进制字符串";
        return Bodh.convertToDecimal(inputOct, Bodh.OCTAL);
    }

    /**
     * 八进制转十六进制
     *
     * @param inputOct 输入的八进制数
     * @return java.lang.String
     * @author Labu
     */
    public static String octalToHexadecimal(String inputOct) {
        if (!Bodh.isLegalOct(inputOct))
            return "无效的八进制字符串";
        return BinaryConversion.binaryToHexadecimal(octalToBinary(inputOct));
    }

}


Decimal Conversion

package io.programming.bodh;

/**
 * @Author Labu
 * @Description 十进制转换
 */
public class DecimalConversion {

    /**
     * 十进制转换的基本算法,对进制基数进行长除法,然后所得余数倒序输出
     *
     * @param input 输入的字符
     * @param base  需要转换的进制基数,在算法中也是除数
     * @return java.lang.String
     * @author Labu
     */
    private static String convert(String input, byte base) {
         /*
        定义商为第一次的被除数,base为除数,remainder为余数,在商为0的余数字符倒序输出就是对应的二进制数
         */
        String result = "";
        int quotient = Integer.parseInt(input);
        int remainder;
        do {
            remainder = quotient % base;
            quotient = quotient / base;
            if (base == Bodh.HEXADECIMAL) { // 如果是转十六进制需要用的转换
                char c = Bodh.toHexChar(remainder);
                result += c;
            } else {
                result += remainder;
            }

        } while (quotient != 0);
        return new StringBuffer(result).reverse().toString();
    }

    /**
     * 十进制数字符串转换成二进制数字符串
     *
     * @param inputDec 输入的十进制字符串
     * @return java.lang.String
     * @author Labu
     */
    public static String decimalToBinary(String inputDec) {
        if (!Bodh.isLegalDec(inputDec))
            return "无效的十进制字符串";
        return convert(inputDec, Bodh.BINARY);
    }

    /**
     * 十进制整数转换成二进制数字符串
     *
     * @param inputDec 输入的十进制整数
     * @return java.lang.String
     * @author Labu
     */
    public static String decimalToBinary(int inputDec) {
        if (inputDec < 0)
            return "这里不做补码转换,想要负数,直接在数字前加负号,请谅解!";
        return decimalToBinary("" + inputDec);
    }

    public static String decimalToOctal(int inputDec) {
        if (inputDec < 0)
            return "这里不做补码转换,想要负数,直接在数字前加负号,请谅解!";
        return decimalToOctal("" + inputDec);
    }

    public static String decimalToHexadecimal(int inputDec) {
        if (inputDec < 0)
            return "这里不做补码转换,想要负数,直接在数字前加负号,请谅解!";
        return decimalToHexadecimal("" + inputDec);
    }

    /**
     * 十进制数字符串转换成八进制数字符串
     *
     * @param inputDec 输入的十进制数字符串
     * @return java.lang.String
     * @author Labu
     */
    public static String decimalToOctal(String inputDec) {
        if (!Bodh.isLegalDec(inputDec))
            return "无效的十进制字符串";
        return convert(inputDec, Bodh.OCTAL);
    }

    /**
     * 十进制数字符串转换成十六进制数字符串
     *
     * @param inputDec 输入的十进制数字符串
     * @return java.lang.String
     * @author Labu
     */
    public static String decimalToHexadecimal(String inputDec) {
        if (!Bodh.isLegalDec(inputDec))
            return "无效的十进制字符串";
        return convert(inputDec, Bodh.HEXADECIMAL);
    }
}


Hexadecimal Conversion

package io.programming.bodh;

/**
 * @Author Labu
 * @Description 十六进制转换
 */
public class HexadecimalConversion {

    /**
     * 16 to 2
     *
     * @param inputHex 输入十六进制字符串
     * @return java.lang.String
     * @author Labu
     */
    public static String hexToBinary(String inputHex) {
        if (!Bodh.isLegalHex(inputHex))
            return "无效的十六进制字符串";
        return Bodh.convertToBinary(inputHex, Bodh.HEXADECIMAL_DIVIDE_BASE);
    }

    /**
     * 16 to 8
     *
     * @param inputHex 输入十六进制字符串
     * @return java.lang.String
     * @author Labu
     */
    public static String hexToOctal(String inputHex) {
        if (!Bodh.isLegalHex(inputHex))
            return "无效的十六进制字符串";
        return BinaryConversion.binaryToOctal(hexToBinary(inputHex));
    }

    /**
     * 16 to 10
     *
     * @param inputHex 输入十六进制字符串
     * @return java.lang.String
     * @author Labu
     */
    public static String hexToDecimal(String inputHex) {
        if (!Bodh.isLegalHex(inputHex))
            return "无效的十六进制字符串";
        return Bodh.convertToDecimal(inputHex, Bodh.HEXADECIMAL);
    }
}


工具类

package io.programming.bodh;

import java.util.*;

/**
 * @Author Labu
 * @Description 进制转换工具类
 */
public class Bodh {

    /*
      二进制标识符
   */
    public static final byte BINARY = 2;

    /*
        八进制标识符
     */
    public static final byte OCTAL = 8;
    public static final byte OCTAL_DIVIDE_BASE = 3;

    /*
        十进制标识符
     */
    public static final byte DECIMAL = 10;

    /*
        十六进制标识符
     */
    public static final byte HEXADECIMAL = 16;
    public static final byte HEXADECIMAL_DIVIDE_BASE = 4;

    final static char[] digits = {
            '0', '1', '2', '3', '4', '5',
            '6', '7', '8', '9', 'a', 'b',
            'c', 'd', 'e', 'f', 'g', 'h',
            'i', 'j', 'k', 'l', 'm', 'n',
            'o', 'p', 'q', 'r', 's', 't',
            'u', 'v', 'w', 'x', 'y', 'z'
    };

    // 十六进制需要的额外字符
    final static char[] exHex = {'A', 'B', 'C', 'D', 'E', 'F'};

    // 十六进制字符与值的映射
    public static final Map<String, String> hexMap = hexMap();

    static List<Character> binaryList = toList(digits, BINARY);
    static List<Character> octalList = toList(digits, OCTAL);
    static List<Character> decimalList = toList(digits, DECIMAL);
    static List<Character> hexList = toList(digits, HEXADECIMAL);

//    public static void main(String[] args) {
//        System.out.println(octalList);
//    }

    /**
     * 将digits中的字符前n个字符转换为List
     *
     * @param chars 字符数组,包含进制基数的字符数组
     * @param base  进制基数
     * @return java.util.List<java.lang.Character>
     * @author Labu
     */
    public static List<Character> toList(char[] chars, byte base) {
        List<Character> characters = new ArrayList<>();
        for (int i = 0; i < base; i++) {
            characters.add(chars[i]);
        }
        if (base == HEXADECIMAL) {
            for (char hex : exHex) {
                characters.add(hex);
            }
        }
        return characters;
    }


    // 二进制数字符串的数据校验
    public static boolean isLegalBin(String inputBin) {
        for (int i = 0; i < inputBin.length(); i++) {
            char c = inputBin.charAt(i);
            if (c != '0' && c != '1')
                return false;
        }
        return true;
    }

    // 八进制数字符串的数据校验
    public static boolean isLegalOct(String inputOct) {
        for (int i = 0; i < inputOct.length(); i++) {
            char c = inputOct.charAt(i);
            if (!octalList.contains(c))
                return false;
        }
        return true;
    }

    // 十进制数字符串的数据校验
    public static boolean isLegalDec(String inputDec) {
        for (int i = 0; i < inputDec.length(); i++) {
            char c = inputDec.charAt(i);
            if (!decimalList.contains(c))
                return false;
        }
        return true;
    }

    // 十六进制数字符串的数据校验
    public static boolean isLegalHex(String inputHex) {
        for (int i = 0; i < inputHex.length(); i++) {
            char c = inputHex.charAt(i);
            if (!hexList.contains(c))
                return false;
        }
        return true;
    }


    /**
     * 其他进制转成二进制
     *
     * @param input      输入的字符串
     * @param divideBase 被分割的基数
     * @return java.lang.String
     * @author Labu
     */
    public static String convertToBinary(String input, int divideBase) {
        String result = "";
        // 每个数字单独提出来转成相应位数的二进制数,不够的补零
        for (int i = 0; i < input.length(); i++) {
            String c = input.charAt(i) + "";
            if (divideBase == Bodh.HEXADECIMAL_DIVIDE_BASE)
                c = hexToDec(c);
            result += Bodh.addZero(DecimalConversion.decimalToBinary(c), divideBase);
        }
        return cutZero(result);
    }

    /**
     * 其他进制转换成十进制的统一算法
     *
     * @param input 输入字符串
     * @return java.lang.String
     * @author Labu
     */
    public static String convertToDecimal(String input, byte base) {
        int length = input.length();
        int sum = 0;
        for (int i = 0; i < length; i++) {
            String s = "" + input.charAt(length - 1 - i);
            if (base == Bodh.HEXADECIMAL)
                s = hexToDec(s);
            int c = Integer.parseInt(s);
            sum += c * Math.pow(base, i);
        }
        return "" + sum;
    }

    /**
     * 剪切掉字符前多余的0
     *
     * @param str 字符串
     * @return java.lang.String
     * @author Labu
     */
    public static String cutZero(String str) {
        int i = 0;
        while (str.charAt(i) == '0') {
            i++;
        }
        return str.substring(i);
    }

    /**
     * 根据需要的num,在字符串前补相差个数的零
     *
     * @param str 需要补零的字符串
     * @param num 需要的长度
     * @return java.lang.String
     * @author Labu
     */
    public static String addZero(String str, int num) {
        for (int i = str.length(); i < num; i++) {
            str = "0" + str;
        }
        return str;
    }

    /**
     * 将数字转换为十六进制表示的字符
     *
     * @param inputHex 输入一般是十进制数
     * @return char
     * @author Labu
     */
    public static char toHexChar(int inputHex) {
        return hexList.get(inputHex);
    }


    /**
     * 十六进制的单个字符串转换成十进制字符串
     *
     * @param inputHex 十六进制字符串
     * @return java.lang.String
     * @author Labu
     */
    public static String hexToDec(String inputHex) {
        return hexMap.get(inputHex);
    }


    /**
     * 生成一个存放十六进制字符对应十进制数值字符串的map
     *
     * @return java.util.Map<java.lang.String, java.lang.String>
     * @author Labu
     */
    public static Map<String, String> hexMap() {
        Map<String, String> hexMap = new HashMap<>();
        for (int i = 0; i < HEXADECIMAL; i++) {
            hexMap.put("" + digits[i], "" + i);
        }
        for (int i = 0, j = 10; i < exHex.length; i++, j++) {
            hexMap.put("" + exHex[i], "" + j);
        }
        return hexMap;
    }

}
posted @ 2021-07-26 23:26  拉布  阅读(120)  评论(0编辑  收藏  举报