任意进制 大整数转化

// 标准数据符号 正负号
    public static final char[] SIGN = new char[]{'+', '-'};


    // 64 进制使用字母, 不包含正负号
    public static final char[] ASCS = new char[]{'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',
                                                   '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'
                                              };
/**
** 将长整数 nl 转化为 bas 进制字符串
** nl  输入长整数
** bas 新的进制单位 (2-62)
**		循环对 nl % bas 处理,得到每位的余数,并按照 ASCS 定义转化为对应字符
**		对生成的余数链表翻转处理,并将 dlst 数据转化为 StringBuilder 
**/
public static String nbasRadix(long nl, int bas) {
        boolean negat = nl < 0L;
        List<Character> dlst = new ArrayList<>();

        nl = Math.abs(nl);

        while( nl >= bas ) {
            dlst.add(ASCS[Math.toIntExact(nl % bas)]);
            nl = nl/bas;
        }
        if( nl > 0 ) dlst.add(ASCS[(int)nl]);
        if(negat) dlst.add(SIGN[1]);

        // 准备将 dlst 链表翻转输出
        Collections.reverse(dlst);

        // 准备清理 dlst 前导 0
        StringBuilder sb = new StringBuilder();
        dlst.forEach(sb::append);
        return sb.toString();
    }											  

@Test
public void testBigNum(){
		long test_Min = -9223372036854775807L ;
        long test_Max =  9223372036854775807L ;

        System.out.printf("test_min(%s) test_max(%s)\n", test_Min, test_Max);

        long min = Long.MIN_VALUE;
        long max = Long.MAX_VALUE;
        System.out.printf("Long.MIN_VALUE(%s) Long.MAX_VALUE(%s)\n", min, max);

        long max2 = (long) Math.pow(2.0, 128.0);
        System.out.printf("Long.MAX_VALUE(%s)\n", max2);
        System.out.println("test_Min " + nbasRadix(test_Min, 16));
        System.out.println("test_Max " + nbasRadix(test_Max, 16));

        System.out.println("test_Min " + 9_223_372_036_854_775_807L);

    }	

	

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值