81进制,用多进制方式把一个长长的整数变短

最近在做项目有些资源要用到唯一的标识code,这个code要全局唯一,因此比较长,有25位,long只能处理到19位。另外25位长的一个整数阅读显示都不是很理想,因此开发了一个多进制的转换类。思想接近把一个域名用几个字符代替。下面就是实现的具体java代码,目前支持到81进制。

 1 import java.math.BigInteger;
 2 import java.util.Arrays;
 3 import java.util.Date;
 4
 5 /**
 6  *
 7  * @author 程序员老刘@2015-07-28
 8  * @Description 把十进制的数字转换成36、62或者81进制,使表达的长度变短,例如99999转成62进制是Q0t
 9  */
10 public class MultiNumberation {
11
12     private final static char[] flag = { ‘0‘, ‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘5‘, ‘6‘, ‘7‘, ‘8‘, ‘9‘, ‘A‘,
13             ‘B‘, ‘C‘, ‘D‘, ‘E‘, ‘F‘, ‘G‘, ‘H‘, ‘I‘, ‘J‘, ‘K‘, ‘L‘, ‘M‘, ‘N‘, ‘O‘, ‘P‘, ‘Q‘, ‘R‘,
14             ‘S‘, ‘T‘, ‘U‘, ‘V‘, ‘W‘, ‘X‘, ‘Y‘, ‘Z‘, ‘a‘, ‘b‘, ‘c‘, ‘d‘, ‘e‘, ‘f‘, ‘g‘, ‘h‘, ‘i‘,
15             ‘j‘, ‘k‘, ‘l‘, ‘m‘, ‘n‘, ‘o‘, ‘p‘, ‘q‘, ‘r‘, ‘s‘, ‘t‘, ‘u‘, ‘v‘, ‘w‘, ‘x‘, ‘y‘, ‘z‘,
16             ‘!‘, ‘#‘, ‘%‘, ‘&‘, ‘$‘, ‘*‘, ‘(‘, ‘)‘, ‘[‘, ‘]‘, ‘{‘, ‘}‘, ‘^‘, ‘~‘, ‘?‘, ‘@‘, ‘>‘,
17             ‘<‘, ‘=‘ };
18
19     public static int getDeep() {
20         return flag.length;
21     }
22
23     public static int findInFlag(String f) {
24         char c = (char) f.getBytes()[0];
25         for (int i = 0; i < flag.length; i++) {
26             if (flag[i] == c)
27                 return i;
28         }
29         return -1;
30     }
31
32     public static BigInteger toDecimal(String multi, int deep) {
33         BigInteger result = new BigInteger("0");
34         if (deep < 1 || deep > flag.length || deep == 10)
35             return result;
36
37         BigInteger d = BigInteger.valueOf(deep);
38         for (int i = 0; i < multi.length(); i++) {
39             int pos = findInFlag(multi.substring(i, i + 1));
40             // Arrays.binarySearch(flag, (char) (multi.substring(i, i +
41             // 1).getBytes()[0]));
42
43             result = result.add(d.pow(multi.length() - i - 1).multiply(BigInteger.valueOf(pos)));
44         }
45         return result;
46     }
47
48     /**
49      *
50      * @Title:
51      * @Description:将十进制整数转为指定进制的数
52      * @param decimal
53      *            --十进制整数
54      * @param deep
55      *            --选择进制,从2~81
56      * @return
57      */
58     public static String toMulti(BigInteger decimal, int deep) {
59         if (deep < 1 || deep > flag.length || deep == 10)
60             return "";
61         // 取余数
62         BigInteger d = BigInteger.valueOf(deep);
63         BigInteger[] bigDivide = decimal.divideAndRemainder(d);
64         int remainder = bigDivide[1].intValue();
65         String result = "" + flag[(int) remainder];
66
67         // 取商
68         BigInteger quotient = bigDivide[0];
69         // 商数下雨指定的进制数则继续
70         if (quotient.compareTo(d) >= 0) {
71             result = toMulti(quotient, deep) + result;
72         } else {
73             result = "" + flag[(int) quotient.intValue()] + result;
74         }
75
76         return result;
77     }
78
79     public static void main(String[] args) {
80         int deep = MultiNumberation.getDeep();
81         // System.out.println("deep=" + deep);
82         long s = new Date().getTime();
83         // MultiNumeration.toMulti(238328L, deep);
84         for (long i = 1000000; i < 1000002; i++) {
85             String code = String.valueOf(i);
86             // String code =
87             // CreateCodeHelper.createCode(SeqObjectName.ServiceGroup_Category);
88             // System.out.println("code=" + code);
89             BigInteger big = new BigInteger(code);
90
91             String ret = MultiNumberation.toMulti(big, deep);
92             System.out.println(code + ">>" + ret + "===>" + MultiNumberation.toDecimal(ret, deep));
93         }
94         System.out.println("deep=" + deep + ",timeout:" + (new Date().getTime() - s));
95     }
96 }
时间: 2024-10-06 22:48:44

81进制,用多进制方式把一个长长的整数变短的相关文章

10进制转62进制,实现穷举指定位数的所有密码组合(暴力破解)

因为我们这里要穷举的密码包括0-9,a-z,A-Z共62个字符,所以我们采用62进制来遍历. 首先,我们实现一个10进制转62进制的方法. private static char[] charSet = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray(); //private static string[] charSet = { "0", "1&qu

十进制转换成十六进制、16进制转2进制

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> int main() { int i,v; char bs[33]; char b[33]; char hs[9]; char h[9]; char s[4]; char *e; // 十进制整数转二进制串: i=1024; ltoa(i,b,2); sprintf(bs,"%032s&quo

蓝桥杯 16进制转换8进制

蓝桥杯 16进制转换8进制 我表示我自己太渣渣了,总是超时,通不过测试. 题目 问题描述 给定n个十六进制正整数,输出它们对应的八进制数.输入格式 输入的第一行为一个正整数n (1<=n<=10). 接下来n行,每行一个由0~9.大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000.输出格式 输出n行,每行为输入对应的八进制正整数.注意 输入的十六进制数不会有前导0,比如012A. 输出的八进制数也不能有前导0.样例输入239123ABC样例输出7144

蓝桥杯之16进制转8进制

题目: 问题描述 给定n个十六进制正整数,输出它们对应的八进制数. 输入格式 输入的第一行为一个正整数n (1<=n<=10). 接下来n行,每行一个由0~9.大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000. 输出格式 输出n行,每行为输入对应的八进制正整数. [注意] 输入的十六进制数不会有前导0,比如012A. 输出的八进制数也不能有前导0. 样例输入 2 39 123ABC 样例输出 71 4435274 [提示] 先将十六进制数转换成某进制

java 16进制转换10进制

public static String toHexString2(byte[] b) { StringBuffer buffer = new StringBuffer(); for (int i = 0; i < b.length; ++i) { buffer.append(toHexString2(b[i])); } return buffer.toString(); } public static String toHexString2(byte b) { char[] buffer =

QT 16进制 ASII &nbsp; 10进制 转换

 //16进制字符串转字节数组     static QByteArray HexStrToByteArray(QString str)     {         QByteArray senddata;  //发送数据         int hexdata,lowhexdata;         int hexdatalen = 0;         int len = str.length();  //求出发送字符传唱度         senddata.resize(len/2); /

JS-011-颜色进制转换(RGB转16进制;16进制转RGB)

在网页开发的时候,经常需要进行颜色设置,因而经常需要遇到进行颜色进制转换的问题,例如:RGB转16进制:16进制转RGB),前几天在测试的时候,发现网站的颜色进制转换某类16进制颜色(例如:#000080,#FA08FA)转换时总是提示颜色非法,看了一下 js 源码,发现其进制转换的方法是错误的.找了一下度娘和谷大爷,最终写了一个颜色转换的小方法,源码如下所示: String.prototype.colorHex2Rgb = function(){ var reg = /^#([0-9a-fA-

python中2进制、10进制、16进制等之间的转换

10转2: bin(8) # '0b1000' 2转10: int('1000', 2) # 8 10转16: hex(15) # '0xf' 16转10: int('f', 16) # 15 2进制和16进制中间通过转10进制可以相互转换

2进制,8进制,16进制转10进制的自定义函数

1.2进制转10进制自定义函数: function DecToInt(temp:string):integer; //2进制转10进制var  i,j  : Integer;begin  result := 0;  j   := Length(temp);  //取得字符串长度:  for I := 0 to Length(temp)-1 do  begin    result := result+strtoint(Copy(temp,j,1))*Trunc(power(2,I));  //Tr