// 标准数据符号 正负号
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);
}
任意进制 大整数转化
于 2023-10-13 14:30:06 首次发布