二进制、十进制转化工具

/**
 * 二进制、十进制转化工具类
 */
public class BinaryUtil {
    /**
     * description: 根据二进制数获取值  例如,输入1010,获取到的是[1,3]
     *
     * @param code:输入10101
     * @param digit        位数
     * @return
     */
    public static List<Integer> getArr(Integer code, Integer digit) {
        //补齐位数
        String newCode = completeDigit(code, digit);
        byte[] arrByte = newCode.getBytes();
        List<Integer> arrayList = new ArrayList<>();
        if (arrByte.length > 0) {
            for (int i = 0; i < arrByte.length; i++) {
                //1对应的ascii为49,0为48
                if (arrByte[i] == 49) {
                    arrayList.add(i + 1);
                }
            }
        }
        return arrayList;
    }


    /**
     * 根据二进制 例如,输入[1,3,4],获取到的是1011
     *
     * @param arr
     * @param digit 位数
     * @return
     */
    public static Integer getBinary(List<Integer> arr, Integer digit) {
        int binary = 0;
        if (arr != null && arr.size() > 0) {
            int tempBinary = 0;
            StringBuilder builder = new StringBuilder("1");
            if (digit >= 1) {
                for (int i = 1; i < digit; i++) {
                    builder.append("0");
                }
            }
            //获取第一位对应的二进制数
            int decimalise = Integer.parseInt(builder.toString(), 2);
            for (int i = 0; i < arr.size(); i++) {
                tempBinary = decimalise >> arr.get(i) - 1;//右移
                binary = tempBinary | binary;//按位或
            }
        }
        return Integer.parseInt(Integer.toBinaryString(binary));
    }


    /**
     * 将输入的二进制补齐位数
     *
     * @param code
     * @param num  长度
     * @return
     */
    public static String completeDigit(Integer code, Integer num) {
        // 0-代表前面补充0  num-长度   d-代表参数为正数型
        return String.format("%0" + num + "d", code);
    }


    /**
     * 判断某天是否工作  例如 输入1100 ,总位数7 ,指定位数4 ,返回false
     *
     * @param code       例如 1011
     * @param totalDigit 总位数
     * @param digit      指定位数
     * @return
     */
    public static Boolean isExist(Integer code, Integer totalDigit, Integer digit) {
        String newCode = completeDigit(code, totalDigit);
        int target = Integer.parseInt(newCode.substring(digit - 1, digit));
        return target == 1;
    }


    /**
     * 改变指定的摸个某个数字  例如 输入1100 ,总位数7 ,指定位数4 ,目标数据0  返回101
     *
     * @param code       例如 1011
     * @param totalDigit 总位数
     * @param digit      指定位数
     * @param target      目标数据
     * @return
     */
    public static Integer changeNum(Integer code, Integer totalDigit, Integer digit, Integer target) {
        int binaryCode = Integer.parseInt(code.toString(),2);
        int temp = 0;
        if(target == 1){
            temp = binaryCode | (target << digit-1);//按位或
        }else if(target == 0){
            if (!getStatusType(binaryCode,digit)){
                temp = binaryCode;
                return  temp;
            }
            //10010 - 1向左移(index-1)
            temp = binaryCode - (1 << (digit - 1));
        }
        return temp;//111011
    }


    /**
     * 根据二进制 例如,输入[1,3,4],获取到的是binary
     *
     * @param arr
     * @param digit 位数
     * @return
     */
    public static Integer getDemical(List<Integer> arr, Integer digit) {
        int binary = 0;
        if (arr != null && arr.size() > 0) {
            int tempBinary = 0;
            StringBuilder builder = new StringBuilder("1");
            if (digit >= 1) {
                for (int i = 1; i < digit; i++) {
                    builder.append("0");
                }
            }
            //获取第一位对应的二进制数
            int decimalise = Integer.parseInt(builder.toString(), 2);
            for (Integer integer : arr) {
                tempBinary = decimalise >> integer - 1;//右移
                binary = tempBinary | binary;//按位或
            }
        }
        return binary;
    }


    private static boolean getStatusType(int num, int index) {
        return (num >> (index - 1) & 1) == 1;
    }


    /**
     * 测试方法
     *
     * @param arags
     */
    public static void main(String[] arags) {
        //测试:根据二进制数获取是星期几
        List<Integer> day = BinaryUtil.getArr(10101, 7);

        //System.out.println(isExist(101, 7, 3));
        System.out.println(changeNum(1101,  5,  2,1));
        //测试:根据星期数获取对应的二进制
        List<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(2);
        list.add(4);
        list.add(6);
        System.out.println(getDemical(list,7));

//        System.out.println( BinaryToDecimalUtil.changeNum(0, 7, 5,1));

        Integer binaryDay = BinaryUtil.getBinary(list, 6);
        //System.out.println(binaryDay);


    }
}

 

posted @ 2022-01-12 10:10  二次元的程序猿  阅读(318)  评论(0编辑  收藏  举报