最近公司在招聘开发工程师,想考察一下他们的基本功和常识。问了进制转换的问题,有很多人就彻底懵逼了,其实进制转换就是高中学习的排列组合的问题。
想必大家碰见过这样的问题。有三个抽屉,现在又7种颜色的球若干。现要求每个抽屉必须放且只能放一个球,问多少种放法。其实这就是每个抽屉都有7个选择的机会,而他们相互之间是不会干扰的,所以他们的方法就是7X7X7个。而在不同的进制当中也是这样的算法,二进制每一个位置只能放0或1,任何两位上存放的数值是不会相互受影响的,所以对于n位的二进制数可以取值的个数就是2的n此幂,如果考虑符号位置以及补码算法,其取值范围就是2的n-1次幂到2的n-1次幂-1。
对于m进制的n位所表示的具体数值大小具体是多少呢? 我们完全可以利用10进制算法一样的,也就是从右相左,从0开始计数,第几位就是m的几次乘以该位上的数字,这样得到若干个数值,然后把这些数值加起来就是最终的结果。下面举一个例子:
比如 有19进制的数字 13464 . 那么这个数字应该是多少呢?
从右向左开始计算依次为 4X(19的0次幂) 6X(19的1次幂) 4X(19的2次幂) 3X(19的3次幂) 1X(19的4次幂) 然后把这些数字加到一起就是了。
如果已知某一个数字,我们想把他转换成某个进制的数字该怎么处理呢?只要用这个数字不断地对进制进行求余,然后把这些余数从右向左排成一行就可以了。比如我们求123的7进制。
第一步 127 除以 7 = 17 余 4
第二步 用 17 除以7 = 2 余 3
第三步 2已经小于7(或2除以7 = 0 余 2 )
将上述各个余数排列起来即可。 234 就是最终的结果。
读者在学习的时候可以利用Integer 的静态方法 static String toString(int i, int radix) 和static int parseInt(String s, int radix)
去验证自己的练习结果。