起因:
面试的时候被问到能否现场写一个进制转换的方法,比如10进制转16进制等.
内心戏:
卧槽,16进制是啥东西?满16进1位,但是怎么表示16呢?1,2,3,4,5,6,7,8,9,10,11,12,13,14,15?然后大于15就进一位?
我特么的连16进制是啥都不知道,写个鸡儿转16进制啊.
面试官说,那你随便写个进制吧,10转2也行.
内心戏02:
10转2怎么转来着?然后开始快速回忆初中高中大学老师怎么是怎么讲10转2的.
10进制转2进制:
功夫不负有心人,我连蒙带猜知道了10转2的过程了.
10÷2=5余0
5÷2=2余1
2÷2=1余0
1÷2=0余1,
余数从下到上连在一起便是结果:1010.
核心代码如下:
public String transJinZhi01(String str, int jinZhi) {
assert str != null && str.length() > 0;
assert jinZhi % 2 == 0 && jinZhi > 0;
Stack<Object> objects = new Stack<>();
//将字符串转成数字
int num = Integer.valueOf(str);
//第一次取余数
int yuShu = num % jinZhi;
//第一次的商,下面判断是否需要遍历
int shang = num / jinZhi;
objects.push(yuShu);
do {
yuShu = shang % jinZhi;
shang = shang / jinZhi;
objects.push(yuShu);
} while (shang != 0);
StringBuffer stringBuffer = new StringBuffer();
while (!objects.empty()) {
Object pop = objects.pop();
stringBuffer.append(pop);
}
String s1 = stringBuffer.toString();
System.out.println("数字" + str + "转化为" + jinZhi + "进制后为 = " + s1);
return null;
}
测试代码如下:
@Test
public void test01() {
//报错
// this.transJinZhi01(null, 10);
//报错
// this.transJinZhi01("10", 1);
//报错
// this.transJinZhi01("10", 0);
//报错
// this.transJinZhi01("", 10);
//正常
this.transJinZhi01("1000", 2);
this.transJinZhi01("1000", 8);
this.transJinZhi01("1000", 10);
//看源码怎么写的
// String s = Integer.toBinaryString(10);
// System.out.println("s = " + s);
}
运行结果是:
数字1000转化为2进制后为 = 1111101000
数字1000转化为8进制后为 = 1750
数字1000转化为10进制后为 = 1000
结束语:
面试时粗略写的,想着趁着这个机会把这个完善下记录下来,也是自己的短板.
此方法是10进制转2、4、8进制的方法,抛开效率讲是可行的,欢迎各位伙伴指正.
我为啥不写任意进制转换呢?
因为我没搞懂超过10进制后怎么表示呢…
尴尬尴尬