任意进制转换和经典的十进制转化为二进制类似,十进制转化为二进制,每次对2取模,然后除以2,直至为0。
所以任意进制的转换同理去写即可
举例:给定一个整数num,十进制转化为十六进制,每次对16取模,然后除以16,直至为0。
需要额外注意负数的情况,根据补码的规则,最高位为符号位,即如果是负数,第32位为1,反之00。
计算机中的运算机制为补码运算,正数的补码为其本身,对于负数,我们加上2^32(相当于按位取反末位加一),将其转移到正数范围内处理,注意int数据范围不够,需要用 long。
需要注意的是要对num为0时进行判断,因为对于负整数,由于最高位一定不是 0,因此不会出现前导零。对于零和正整数,可能出现前导零。
class Solution {
public String toHex(int num) {
if(num==0) return "0";
long n=num;
if(num<0) n=(long) (Math.pow(2,32)+num);
StringBuilder sb=new StringBuilder();
while(n!=0){
long u=n%16;
char c=(char) (u+'0');
if(u>=10) c=(char)(u-10+'a');
sb.append(c);
n/=16;
}
return sb.reverse().toString();
}
}
同理,n进制的数num转换为m进制,就先将num转换为10进制的整数,再转换成m进制
举例,将五进制的111转换为16进制
class Solution {
public String toHex(int num) {
if(num==0) return "0";
long n=num;
if(num<0) n=(long) (Math.pow(2,32)+num);
StringBuilder sb=new StringBuilder();
while(n!=0){
long u=n%16;
char c=(char) (u+'0');
if(u>=10) c=(char)(u-10+'a');
sb.append(c);
n/=16;
}
return sb.reverse().toString();
}
public int toDec(int num,int x){
int base=1;
int n=0;
while(num!=0){
n+=base*(num%10);
num/=10;
base*=x;
}
return n;
}
public static void main(String[] args) {
Solution solution = new Solution();
int n=solution.toDec(111,5);
System.out.println(solution.toHex(n));
}
}
这里的任意进制转换只能2到35进制之间转换,因为超过9之后表示数字的英文只有26个



