• 二进制、十进制转化工具


    /**
     * 二进制、十进制转化工具类
     */
    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);
    
    
        }
    }
    随笔看心情
  • 相关阅读:
    b_lc_实现库函数篇(atoi、)
    c_jz_调整数组顺序使奇数位于偶数前面∈(有/无相对顺序要求)(双指针)
    c_lc_扑克牌顺子(模拟 / 思维)
    b_nk_找到字符串的最长无重复字符子串(双指针+map)
    b_nk_找到搜索二叉树中两个错误的节点(利用特性)
    b_nk_树的直径(一次dfs)
    c_nk_判断t1树中是否有与t2树拓扑结构完全相同的子树(双指针判断子序列的思想)
    a_lc_完成所有任务的最少初始能量(反向思维+贪心)
    b_lc_生成平衡数组的方案数(奇偶前缀和)
    b_lc_具有给定数值的最小字符串(小思维)
  • 原文地址:https://www.cnblogs.com/stromgao/p/15791331.html
Copyright © 2020-2023  润新知