Jer*_*ock 75
给定一个数字i
,使用Integer.toString(i, 36)
.
Ric*_*iwi 16
请参阅Integer.toString的文档
http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#toString(int,%20int)
toString
public static String toString(int i, int radix)
....
The following ASCII characters are used as digits:
0123456789abcdefghijklmnopqrstuvwxyz
Run Code Online (Sandbox Code Playgroud)
什么是radix
?你很幸运Base 36(这很有意义)
http://docs.oracle.com/javase/7/docs/api/java/lang/Character.html#MAX_RADIX
public static final int MAX_RADIX 36
Run Code Online (Sandbox Code Playgroud)
hcp*_*asj 14
以下内容适用于任何基础,而不仅仅是36.只需替换字符串内容即可code
.
编码:
int num = 586403532;
String code = "0123456789abcdefghijklmnopqrstuvwxyz";
String text = "";
j = (int)Math.ceil(Math.log(num)/Math.log(code.length()));
for(int i = 0; i < j; i++){
//i goes to log base code.length() of num (using change of base formula)
text += code.charAt(num%code.length());
num /= code.length();
}
Run Code Online (Sandbox Code Playgroud)
解码:
String text = "0vn4p9";
String code = "0123456789abcdefghijklmnopqrstuvwxyz";
int num = 0;
j = text.length
for(int i = 0; i < j; i++){
num += code.indexOf(text.charAt(0))*Math.pow(code.length(), i);
text = text.substring(1);
}
Run Code Online (Sandbox Code Playgroud)
首先,你必须将你的数字转换为Java的内部数字格式(恰好是基于2的,但这在这里并不重要),例如通过 Integer.parseInt()
(如果你的数字是一个小于2 ^ 31的整数).然后,您可以将其转换int
为所需的输出格式.该方法Integer.toString(i, 36)
通过使用0123456789abcdefghijklmnopqrstuvwxyz
数字(小数位0-9和小写英文字母按字母顺序)来完成此操作.如果你想要一些其他的数字,你可以通过替换"数字"(例如toUpperCase
)来转换结果,或者自己进行转换 - 这不是魔术,只是一个循环,取其余的模36并除以36(用查找正确的数字).
如果你的数字比int提供的要长,你可能想要使用long
(Long
或),或者BigInteger
相反,它们有类似的基数转换器.
如果你的数字有"点之后的数字",那就更难了,因为如果(幂)Y不是(有限的)基数Y数,那么大多数(有限的)基数X数不能完全表示为X的倍数.
归档时间: |
|
查看次数: |
54351 次 |
最近记录: |