【更多小知识】【HTML】【JAVA】toString还能转换n进制

192 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情

1 前言

以往,一直以为toString就是简单的转字符类型。但是,今天早上偶然在技术摸鱼群里发现,一个老哥突然接到面试电话,面试官让他做一个进制转换的方法函数,原话的题目是:“传入x,y两个参数,x代表数字,y代表进制,输出x转y进制的结果”。
  一个大佬冒了出来,用x.toString(y)得结果啦!
image.png
还去试了一波可以撒~
image.png
这能简单看出,是可以使用toString转换进制了。那这时候我们就来用HTMl、JAVA实验一下。

2 HTMl实验toString

效果图 image.png

完整代码

<!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

效果图 image.png 完整代码

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)的源码,看看底层原理~
image.png
"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进制 image.png

额外 Integer.decode()方法

Integer.decode()方法,可以将String解码为Integer;并且该方法还接受十进制,十六进制和八进制数。 如十六进制(0x): image.png

最后

  感谢你看到最后,最后再说两点~
  ①如果你持有不同的看法,欢迎你在文章下方进行留言、评论。
  ②如果对你有帮助,或者你认可的话,欢迎给个小点赞,支持一下~
  我是南方者,一个热爱计算机更热爱祖国的南方人。

  (文章内容仅供学习参考,如有侵权,非常抱歉,请立即联系作者删除。)