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进制
最后
感谢你看到最后,最后再说两点~
①如果你持有不同的看法,欢迎你在文章下方进行留言、评论。
②如果对你有帮助,或者你认可的话,欢迎给个小点赞,支持一下~
(文章内容仅供学习参考,如有侵权,非常抱歉,请立即联系作者删除。)