一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情。
1 前言
以往,一直以为toString就是简单的转字符类型。但是,今天早上偶然在技术摸鱼群里发现,一个老哥突然接到面试电话,面试官让他做一个进制转换的方法函数,原话的题目是:“传入x,y两个参数,x代表数字,y代表进制,输出x转y进制的结果”。
一个大佬冒了出来,用x.toString(y)得结果啦!
还去试了一波可以撒~
这能简单看出,是可以使用toString转换进制了。那这时候我们就来用HTMl、JAVA实验一下。
2 HTMl实验toString
效果图
完整代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>南方者 - 掘金</title>
</head>
<body>
</body>
<script>
console.log("getHEX(64, 8):", getHEX(64, 8));
console.log("getHEX(100, 3):", getHEX(100, 3));
console.log("getHEX(206, 4):", getHEX(206, 4));
console.log("getHEX(209, 9):", getHEX(209, 9));
console.log("getHEX(10, 5):", getHEX(10, 5));
function getHEX(x, y) {
return x.toString(y);
}
</script>
</html>
3 JAVA实验toString
效果图
完整代码
package com.nanfangzhe.anpai;
public class Demo {
public static void main(String[] args) {
try {
System.out.println("getHEX(64,8): " + getHEX(64, 8));
System.out.println("getHEX(100, 3): " + getHEX(100, 3));
System.out.println("getHEX(206,4): " + getHEX(206, 4));
System.out.println("getHEX(209,9): " + getHEX(209, 9));
System.out.println("getHEX(10,5): " + getHEX(10, 5));
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 传入x,y两个参数,x代表数字,y代表进制,输出x转y进制的结果
*
* @Method: getHEX
* @author: nanfangzhe
* @date: 2022年4月9日
* @param x
* @param y
* @return String
*/
public static String getHEX(int x, int y) {
return Integer.toString(x, y);
}
}
拓展-了解toString底层源码
突然想到,我们去了解底层,这样我们不就完美的完成那个网友的面试需求了。赶紧的,我们进一步去了解一下Integer.toString(i, radix)的源码,看看底层原理~
"Returns a string representation of the first argument in the radix specified by the second argument."(来源底层英文注释)
译:就是说,传入两个参数,第二个参数是指定进制数,返回第一个参数的字符串表示形式。
这不正对面试的答案吗?
接下来,我们来看看底层,笔者的分析与理解就直接在代码里注释了~
(资料参考:blog.csdn.net/qq_15068711…
// digits(10个数字 + a-z 26个字母)
final static char[] digits = {
'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'
};
public static String toString(int i, int radix) {
// MIN_RADIX:2 MAX_RADIX:36 (这里进制数超过36或小于2就置为10进制)
if (radix < Character.MIN_RADIX || radix > Character.MAX_RADIX)
radix = 10;
/* Use the faster version */
if (radix == 10) { // 十进制就直接还回第一个参数的String形式
return toString(i);
}
// 用于转换进制的字符数组
char buf[] = new char[33]; // 定义32个字符(返回String类型会计算偏移量)
boolean negative = (i < 0);
int charPos = 32; // 标记buf数组最后一位,方便后面边存放字符
// 不为负数,置为负数(主要目的是考虑边界值(如果是正数再进行进制转换就超出范围)
// Tips:int范围是 -(2^31) ~ (2^31)-1
if (!negative) {
i = -i;
}
// 使用短除法来转换进制
//(短除法:先把每个数的因数找出来,然后再找出公因数,最后在公因数中找出最大公因数。)
while (i <= -radix) { // 循环短除法,找到所有余数
buf[charPos--] = digits[-(i % radix)]; // digits(10个数字 + a-z 26个字母)
i = i / radix;
}
buf[charPos] = digits[-i];
if (negative) {
buf[--charPos] = '-'; // 如果第一个参数传入是负数,首位加上“-”
}
return new String(buf, charPos, (33 - charPos));
}
例子:将18转成2进制
额外 Integer.decode()方法
Integer.decode()方法,可以将String解码为Integer;并且该方法还接受十进制,十六进制和八进制数。
如十六进制(0x):
最后
感谢你看到最后,最后再说两点~
①如果你持有不同的看法,欢迎你在文章下方进行留言、评论。
②如果对你有帮助,或者你认可的话,欢迎给个小点赞,支持一下~
我是南方者,一个热爱计算机更热爱祖国的南方人。
(文章内容仅供学习参考,如有侵权,非常抱歉,请立即联系作者删除。)